14

我刚刚发现了如何检查是否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_typervalue_of_type.

4

2 回答 2

7

这是一种众所周知的技术,恐怕:-)

当然,在运算符中使用函数调用sizeof指示编译器在编译时执行参数推导和函数匹配。此外,使用模板函数,编译器还从模板实例化具体函数。但是,此表达式不会导致生成函数调用。它在SFINAE Sono Buoni PDF 中有很好的描述。

检查其他C++ SFINAE 示例

于 2010-01-24T16:18:04.010 回答
1

它只是两个众所周知的技巧的组合。SFINAE 说“替换失败不是错误”——这正是你所做的。使用sizeof让编译器将模板参数替换为表达式而不实际执行它也很常见。

对不起 :-)

于 2010-01-24T16:14:57.673 回答