C ++ SFINAE和!std :: is_member_function_pointer :: value的有效性

时间:2017-09-26 12:13:37

标签: c++ sfinae

我正在使用C ++中的SFINAE来创建一个通用的容器插入器模板函数,并且认为通过以下构造考虑门控的模板

// replace T::nonexistent_member with whatever member function you want to test
// note the ! negation operator
std::enable_if< ! std::is_member_function_pointer<decltype(&T::nonexistent_member)>::value>

按照定义从不有效。

当成员函数不存在时,SFINAE规则会说&#34; T没有名为nonexistent_member的成员函数,所以不要在考虑模板时烦恼作为比赛。&#34;

当成员函数存在时,is_member_function_pointer计算结果为true,使enable_if为false并删除模板。

我说错了吗?这种类型表达式在定义上是不正确的,在评估时,它只会计算为false。

1 个答案:

答案 0 :(得分:1)

如果T::nonexistent_member是会员功能,请确保此后enable_if会分流。

但是,它也可以是数据成员,静态成员函数或静态数据成员。在这些情况下,&T::nonexistent_member有效,但是成员函数指针,因此enable_if通过。