gpt4 book ai didi

c++ - 我可以使用 SFINAE 检测模板类成员函数吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:28 26 4
gpt4 key购买 nike

我多次成功使用SFINAE。检测一个类是否提供了一个功能不是问题。我目前的问题似乎与his problem相反!与其同时检测派生方法,我更愿意检测类的方法。好像跟方法是模板有关。

是否可以检测类模板方法?我尝试用一​​种不应该造成伤害的类型来实例化模板,但没有成功。

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!非常酷,这里是 error !

最佳答案

该问题与类模板无关,类模板已正确解决,但与成员地址表达式中的怪异问题有关。特别是,对于以下类型:

struct base { void foo(); };
struct derived : base {};

表达式 &derived::foovoid (base::*)() 类型,这可能直观也可能不直观。

关于检测成员函数模板是否存在的测试,我没有答案。您不能获取模板的地址,但您可以创建一个伪造的不可访问类型并尝试使用该类型调用该函数。该类可以具有采用该类型的函数的唯一方法是函数本身是模板。您可能希望在未求值的表达式中使用 this 来避免 odr-using 模板函数与您的类型。

关于c++ - 我可以使用 SFINAE 检测模板类成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18086020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com