我多次成功使用 SFINAE。检测一个类是否提供函数不是问题。我现在的问题似乎与他的问题相反!我宁愿只检测类的方法,而不是检测派生方法。这似乎与该方法是模板这一事实有关。
是否可以检测类模板方法?我试图用一种不应该伤害但没有运气的类型来实例化模板。
struct A { template<class T> void Func( T ) {}; };
struct B :A {};
template< class T >
struct CheckForFunc
{
typedef char(&YesType)[1];
typedef char(&NoType)[2];
template< class U, void (U::*)( int ) > struct Sfinae;
template< class T2 > static YesType Test( Sfinae<T2,&T2::Func>* );
template< class T2 > static NoType Test( ... );
static const bool value = sizeof(Test<T>(0))==sizeof(YesType);
};
int main(int argc, char* argv[])
{
// gives "1"
std::cout << "Value A=" << CheckForFunc< A >::value << std::endl;
// doesn't compile!
std::cout << "Value B=" << CheckForFunc< B >::value << std::endl;
return 0;
}
错误信息:
error: ‘&A::Func’ is not a valid template argument for type ‘void (B::*)(int)’ because it is of type ‘void (A::*)(int)’
请注意,此 SFINAE 非常适用于模板方法,但不适用于派生!不好的是它不仅检测到错误,而且编译失败。
如何在不使用“样本”类型(这里:int)的情况下编写 SFINAE 测试?
编辑:对不起,仅限 C++03!LLVM 也很好,VS2008 也很好,只是 GCC 和 QNX 不行(我明天必须看看的版本)。
Edit2:不知道 Coliru!非常酷,这是错误!