加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 这被认为是SFINAE吗?

发布时间:2020-12-16 05:21:59 所属栏目:百科 来源:网络整理
导读:我问了一个星期前的一个问题,询问我如何才能简单地实例化一个类模板,只要它具有特定的成员函数的类型.在我的答案中,我得到了一个复杂的解决方案.但是后来我试图自己做.我只是想知道如果这足以计算出一个给定的类型T,则具有一个名为f的void函数取0个参数. #in
我问了一个星期前的一个问题,询问我如何才能简单地实例化一个类模板,只要它具有特定的成员函数的类型.在我的答案中,我得到了一个复杂的解决方案.但是后来我试图自己做.我只是想知道如果这足以计算出一个给定的类型T,则具有一个名为f的void函数取0个参数.
#include <type_traits>
#include <utility>

template <typename T,typename = void>
struct has_f : std::false_type { };

template <typename T>
struct has_f<
    T,decltype(std::declval<T>().f(),void())> : std::true_type { };

template <typename T,typename = typename std::enable_if<has_f<T>::value>::type>
struct A { };

struct B
{
    void f();
};

struct C { };

template class A<B>; // compiles
template class A<C>; // error: no type named ‘type’ 
                     // in ‘struct std::enable_if<false,void>’

如果是这样,为什么其他答案在this thread?这么复杂

解决方法

是的,你已经解决了最简单,最惯用的风格的C 11 SFINAE.

请注意,您没有检查返回类型是否为void,它是非静态成员,也没有参数. f只需调用即可.甚至可能是一个函子.

要检查一个无效的非静态函数返回void,请使用

template <typename T>
struct has_f<T,decltype(void( static_cast< void (T::*)( void ) >( &T::f ) )) >
    : std::true_type {};

template <typename T>
struct has_f<T,decltype(void( static_cast< void (T::*)( void ) const >( &T::f ) )) >
    : std::true_type {};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读