這是代碼:SFINAE模板參數(enable_if)不變量符
#include <iostream>
#include <type_traits>
template <class T>
typename std::enable_if<std::is_integral<T>::value,bool>::type
is_odd (T i) {return bool(i%2);}
// 2. the second template argument is only valid if T is an integral type:
template < class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>
bool is_even (T i) {return !bool(i%2);}
int main() {
short int i = 1; // code does not compile if type of i is not integral
std::cout << std::boolalpha;
std::cout << "i is odd: " << is_odd(i) << std::endl;
std::cout << "i is even: " << is_even(i) << std::endl;
return 0;
}
我努力學習的enable_if
正確使用,如果它用作返回類型說明我不解的是:編譯會忽略代碼。意思是,函數不會在二進制文件中。
如果它在模板參數中使用,我有點困惑。根據上面的代碼,它說有the second template argument is only valid if T is an integral type
但我很困惑第二個參數的目的是什麼?
我刪除了它,並把它改爲:
template < class T>
bool is_even (T i) {return !bool(i%2);}
,它仍然能正常工作。有人能澄清我的真正目的是什麼?它上面也沒有變量說明符。
或者,也許它只是作爲一個檢查,如果生病做類似
template < class T,
class B= typename std::enable_if<std::is_integral<T>::value>::type>
讓我在我的代碼中訪問B(可以是真或假的)?
'class = std :: enable_if_t * = nullptr'我從此代碼中獲得「template argument1 is invalid」 –
@CarloBrew刪除'class ='部分 – 0x499602D2
爲什麼它必須是一類?我看到,我注意到的一件事就是。像這樣的事件是否意味着用在'consexpr'上? –