내 걸릴 : 당신이 metafunction 걸릴 수 있습니다, 그것은 잘 작동합니다. 왜 그것이 작동하는지 잠시 논의 해 봅시다.
sizeof
실제로 표현식을 평가하지 않습니다. 그것의 타입을 추론하고 그 타입의 크기를 리턴한다. 유형 크기는 구현에 따라 정의되며 이에 대해서는별로 알 수 없지만 sizeof(char) != sizeof(char[2])
을 알고 있으므로 테스트 할 때이 유형을 사용합니다.
우리는 any_t
유형을 사용하여 네임 스페이스 수준에서 스트림 연산자를 정의합니다.이 연산자는 모든 유형을 받아들이고 어떤 것을 반환하도록합니다 (ostream &
이 아닌 한 실제로 어떤 유형이 중요하지는 않습니다). 이것은 유형에 스트림 연산자가 정의되어 있지 않은 경우 다시 폴백합니다. 클래스 자체에서 이제는 두 개의 함수를 정의합니다. 하나는 ostream &
이며, 스트림 연산자가 정의 된 경우 결과이고, 하나는 대체 기능을 위해 정의한 반환 유형입니다.
sizeof(test(s << c))
이제 다시 식을 평가하지 않고 반환 형식을 결정하고 크기 만 반환 할 수 있습니다.
이제 어떻게 작동하는지 알 수있는 모든 것이 남았습니다.이를 애플리케이션에 포함시키는 것입니다. 이를 수행하는 데는 여러 가지 방법이 있습니다. 당신은 아마 것이다 (C++ (11)가 당신을 위해 사용할 수있는 경우
template <bool, typename T>
struct to_string_functor
{
std::string operator()(T const & t) const
{
std::stringstream ss;
ss << t;
return ss.str();
}
};
template <typename T>
struct to_string_functor<false, T>
{
std::string operator()(T const &) const
{
return typeid(T).name();
}
};
template <typename T>
struct foo
{
std::string to_string() const
{
return to_string_functor<
has_insertion_operator<T>::value, T
>()(m_Value);
}
/* ... */
};
는,이 작업을 수행하는 더 많은 방법, enable_if
되는 또 하나 있습니다 또한 작동하는 한 가지 방법은, 이전의 C++ (11)는 펑터를 사용하는 것입니다 이를 위해 부분적으로 특수화 된 기능을 원한다.); 이 문제에 관해 this excellent blog post을 읽고 싶을 수도 있습니다.
그러나이 간단한 경우에는 필자가 내 의견을 반영해야합니다.
에서 boost::has_left_shift
//이 C++ (11)가 허용되어 사용할 수 있을까? – nijansen