2012-01-21 34 views
1

下面的函數對所有的算術類型定義:如何理解提振下使用:: enable_if和boost :: disable_if

template <class T> 
typename enable_if_c<boost::is_arithmetic<T>::value, T>::type 
foo(T t) { return t; } 

問題1>什麼是價值意思嗎?爲什麼不簡單使用boost::is_arithmetic<T>

boost::is_arithmetic<T>::value 

問2>是否type意味着T

問題3>是真的,boost::is_arithmetic<T>::value只用於過濾非算術和功能,實際上只需要T

問題4>如何閱讀以下說明?

template <typename T> 
void dodah(T i, typename disable_if<is_integral<T> >::type* p=0) 
{ 
    cout << "I: " << i << endl; 
} 

莫非1>禁用整體式2>只接受非整數型和已埋入型如type

謝謝

回答

6

1)值是一個布爾常量將被定義爲true,如果T是算術這在我的版本提升意味着整體或浮點數類型。

2)如果is_arithmetic :: value爲true,則type爲T上的typedef,否則不定義。一般來說,如果沒有被定義的類型,人們會認爲這不會然而編譯,作爲boost documentation狀態:

模板函數在C++超載的明智操作依賴於SFINAE(取代故障影響的是-不-AN-誤差)原理:如果函數的模板的實例化期間形成了無效的參數或返回類型,實例化是由集而不是使一個編譯錯誤

這作爲去除該特定效果的重載解析除去當T不是算術時,用於模板分辨率的模板函數。

3)是

4)該讀,不若T是模板的分辨率整體使用這個模板函數。但是,在您使用非整數類型調用函數的情況下,您不希望傳遞虛擬的第二個參數,因此是默認值。

相關問題