Acabo de descubrir cómo comprobar si se proporciona operator<<
para un tipo.SFINAE + sizeof = detectar si la expresión compila
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;
};
¿Es este truco bien conocido, o acabo de ganar el premio Nobel de metaprogramación? ;)
EDITAR: Hice el código más simple de entender y más fácil de adaptar con dos declaraciones de plantilla de función global lvalue_of_type
y rvalue_of_type
.
Con VC++ parece que 'is_printable :: valor' es cierto para cualquier X, y con Comeau línea que parece ser falsa para cualquier X. Con –
UncleBens
g ++, consigo 1 para' is_printable :: valor' y 0 para 'is_printable > :: value', por lo que funciona bien para mí. –
fredoverflow
por lo que funciona en 1 de cada 3 compiladores ... – UncleBens