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 關注
- 673 瀏覽
添加回答
舉報