SFINAE成员函数存在测试问题

时间:2012-06-30 09:55:54

标签: c++ sfinae

我有这个成员函数测试:

template <typename T> 
struct has_member {
    template <typename U>  static true_type  f(decltype(declval<U>().member()) *);
    template <typename>    static false_type f(...);
    static const bool value =  decltype(f<T>(0))::value;
};

当存在具有给定名称的成员函数时,如果函数具有不带参数的重载,则计算结果为true。对于这样的函数和STL容器,除了元素访问函数(正面,背面等)之外,它的工作正常,它总是评估为假。

为什么?我mingw g ++ 4.7。

1 个答案:

答案 0 :(得分:6)

那是因为这些函数返回引用,并且您声明了一个指向返回值的指针,即指向引用的指针,这是不可能的。

快速修复将是:

template <typename U>  static true_type  
        f(typename remove_reference< decltype(declval<U>().member()) >::type *);

PS :如果强制编译器在SFINAE失败时发出错误并且您认为不应该这样做,则可以(相对)轻松解决这些错误。

我的意思是,在您的代码中,只需注释掉false_type,并在true_type是唯一选项时查看编译器中的错误。在一系列无意义的界限之间有以下内容:

test.cpp:9:50: error: forming pointer to reference type
    ‘__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type& {aka int&}’