猿问

C ++ SFINAE示例?

我想了解更多模板元编程。我知道SFINAE代表“替代失败不是错误”。但是有人可以向我展示SFINAE的良好用途吗?



忽然笑
浏览 645回答 3
3回答

精慕HU

我喜欢SFINAE用来检查布尔条件。template<int I> void div(char(*)[I % 2 == 0] = 0) {&nbsp; &nbsp; /* this is taken when I is even */}template<int I> void div(char(*)[I % 2 == 1] = 0) {&nbsp; &nbsp; /* this is taken when I is odd */}这可能非常有用。例如,我用它来检查使用运算符逗号收集的初始化列表是否不超过固定大小template<int N>struct Vector {&nbsp; &nbsp; template<int M>&nbsp;&nbsp; &nbsp; 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 {&nbsp; &nbsp; template<int M>&nbsp;&nbsp; &nbsp; Vector(MyInitList<M> const& i,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;typename enable_if_c<(M <= N)>::type* = 0) { /* ... */ }}在实践中,我经常发现检查条件的能力是一种有用的能力。
随时随地看视频慕课网APP
我要回答