(1) 該模板的定義如下:
template <bool _Test, class _Ty = void>
struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty>
struct enable_if<true, _Ty> { // type is _Ty for _Testusing type = _Ty;
};template <bool _Test, class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;
當第一個模板參數為 true 時 , 名稱 enable_if_t 才對應類型名 _Ty 。進而可以用 enable_if_t 來定義變量。
看源碼時,經常出現的情況是類的成員函數是模板函數,但對成員函數的模板參數的類型加以限制。
即某些條件滿足時才可以調用類的該成員函數。若類里只有一個具有此名字的成員函數,且對其調用的條件不滿足(沒有給出合適的模板參數),結果是在編譯階段,代碼就報錯了。這就是使用 enable_if_t 的好處。
舉個 STL 庫中為類的模板成員函數使用 enable_if_t 的例子:
(2)寫個小練習:
上例中的 A 只可以接受 char 類型的實參。若以其它類型為實參,則編譯階段就報錯了,很神奇呢:
謝謝閱讀