3 回答
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) { /* ... */ }
}
在实践中,我经常发现检查条件的能力是一种有用的能力。
- 3 回答
- 0 关注
- 644 浏览
添加回答
举报