Я только что узнал, как проверить, предоставляется ли operator<<
для типа.
template<class T> T& lvalue_of_type();
template<class T> T rvalue_of_type();
template<class T>
struct is_printable
{
template<class U> static char test(char(*)[sizeof(
lvalue_of_type<std::ostream>() << rvalue_of_type<U>()
)]);
template<class U> static long test(...);
enum { value = 1 == sizeof test<T>(0) };
typedef boost::integral_constant<bool, value> type;
};
Этот трюк хорошо известен, или я только что выиграл Нобелевскую премию по метапрограммированию?;)
РЕДАКТИРОВАТЬ: я сделал код проще для понимания и легче адаптировать с помощью двух глобальных объявлений шаблонов функций lvalue_of_type
и rvalue_of_type
.