मुझे पता चला कि operator<<
किसी प्रकार के लिए प्रदान किया गया है या नहीं।SFINAE + sizeof = पता लगाएं कि अभिव्यक्ति संकलित
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
के साथ अनुकूलित करने के लिए आसान और आसान बनाने के लिए बनाया है।
++ ऐसा लगता है कि 'is_printable :: मान' किसी भी एक्स के लिए सच है, और Comeau साथ ऑनलाइन यह किसी भी एक्स –
UncleBens
जी के साथ के लिए झूठी प्रतीत होता है ++, मैं' is_printable :: मान' और के लिए 1 मिलता है 'Is_printable > :: value' के लिए 0, इसलिए यह मेरे लिए ठीक काम करता है। –
fredoverflow
तो यह 3 कंपेलरों में से 1 पर काम करता है ... – UncleBens