亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 673 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號