Ich habe gerade herausgefunden, wie überprüft werden kann, ob operator<<
für einen Typ zur Verfügung gestellt wird.SFINAE + sizeof = erkennen, ob Ausdruck kompiliert
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;
};
Ist dieser Trick bekannt, oder habe ich gerade den Metaprogrammierungs-Nobelpreis gewonnen? ;)
EDIT: Ich machte den Code einfacher zu verstehen und einfacher mit zwei globalen Funktionsschablonen Deklarationen lvalue_of_type
und rvalue_of_type
anzupassen.
Mit VC++ scheint 'is_printable :: value' für jedes X wahr und mit Comeau Online scheint es falsch für jedes X. –
UncleBens
Mit g ++, bekomme ich 1 für' is_printable :: value' und 0 für 'is_printable > :: value', also funktioniert es gut für mich. –
fredoverflow
So funktioniert es auf 1 von 3 Compilern ... – UncleBens