2013-02-15 54 views

回答

5
template <typename T> 
typename std::enable_if<std::is_floating_point<T>::value, T>::type foo() { ... } 

它是完全標準SFINAE;我們啓用返回類型。如果T不是浮點類型,則std::is_floating_point<T>::value將爲false,std::enable_if<false, T>不會提供type typedef,這會導致該函數不可編譯。

有關這些標準庫類的信息,請參閱http://en.cppreference.com/w/cpp/types

+1

有關它如何工作的一些解釋會很好。 – 2013-02-15 18:48:35

+0

這樣比較好:D – 2013-02-15 19:05:18

3

是,使用模板專業化和SFINAE:

template<typename T> 
struct foo_enabled 
{ 
}; 

template<> 
struct foo_enabled<float> 
{ 
    typedef void *value; 
}; 

template<> 
struct foo_enabled<double> 
{ 
    typedef void *value; 
}; 

template<> 
struct foo_enabled<long double> 
{ 
    typedef void *value; 
}; 

template <typename T> 
T foo(typename foo_enabled<double>::value=NULL){ ... } 

當然,如果你有C++ 11,安德烈·蒂塔的解決方案是更聰明。

+0

這是我的想象還是您之前找到的Markdown錯誤。 – 2013-02-15 19:05:38

+0

@LightnessRacesinOrbit:不知道...我複製,粘貼,出錯了。刪除,複製,再次粘貼幾次,最後它正確。也許在邊緣有一些看不見的角色... – rodrigo 2013-02-15 19:45:35

+0

mm我嘗試在meta上簡單重現並失敗;並沒有進一步研究它,但它在那裏看起來很有趣。那麼,fsvo無論如何都是「有趣的」;) – 2013-02-15 22:22:01

相關問題