Tôi chỉ tìm ra cách kiểm tra xem operator<<
có được cung cấp cho một loại hay không.SFINAE + sizeof = phát hiện nếu biểu thức biên dịch
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;
};
Bí quyết này có nổi tiếng hay tôi vừa giành giải Nobel về lập trình meta? ;)
EDIT: Tôi đã làm cho mã đơn giản hơn để hiểu và dễ dàng hơn để thích ứng với hai khai báo mẫu chức năng toàn cầu lvalue_of_type
và rvalue_of_type
.
Với VC++ xuất hiện rằng 'is_printable :: giá trị' là đúng cho bất kỳ X nào và với Comeau Online, nó có vẻ sai cho bất kỳ X. –
UncleBens
Với g ++, tôi nhận được 1 cho' is_printable :: value' và 0 cho 'is_printable > :: giá trị', vì vậy nó hoạt động tốt cho tôi. –
fredoverflow
Vì vậy, nó hoạt động trên 1 trong 3 trình biên dịch ... – UncleBens