为了账号安全,请及时绑定邮箱和手机立即绑定

C ++ SFINAE示例?

C ++ SFINAE示例?

C++
忽然笑 2020-02-04 15:37:28
我想了解更多模板元编程。我知道SFINAE代表“替代失败不是错误”。但是有人可以向我展示SFINAE的良好用途吗?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

我喜欢SFINAE用来检查布尔条件。


template<int I> void div(char(*)[I % 2 == 0] = 0) {

    /* this is taken when I is even */

}


template<int I> void div(char(*)[I % 2 == 1] = 0) {

    /* this is taken when I is odd */

}

这可能非常有用。例如,我用它来检查使用运算符逗号收集的初始化列表是否不超过固定大小


template<int N>

struct Vector {

    template<int M> 

    Vector(MyInitList<M> const& i, char(*)[M <= N] = 0) { /* ... */ }

}

仅当M小于N时才接受该列表,这意味着初始化列表没有太多元素。


语法的char(*)[C]含义是:指向元素类型为char和size的数组的指针C。如果C为false(此处为0),则获得无效的type char(*)[0],该指针指向大小为零的数组:SFINAE使之有效,因此该模板将被忽略。


用表示boost::enable_if,看起来像这样


template<int N>

struct Vector {

    template<int M> 

    Vector(MyInitList<M> const& i, 

           typename enable_if_c<(M <= N)>::type* = 0) { /* ... */ }

}

在实践中,我经常发现检查条件的能力是一种有用的能力。


查看完整回答
反对 回复 2020-02-04
  • 3 回答
  • 0 关注
  • 644 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信