2013-09-24 41 views
1

我對std :: enable_if的第二個參數感到困惑。 在使用int類型的返回類型,我們可以把它用:std :: enable_if的第二個參數有什麼用?

template <class T> 
typename std::enable_if<mpi::is_builtin<T>::value, int>::type 
foo() { return 1; } 

但我怎麼能在的參數或模板中使用enable_if?在這種情況下,以下功能有什麼不同:

template<class T , 
     class = typename std::enable_if<std::is_integral<T>::value>::type > 
T too(T t) { std::cout << "here" << std::endl; return t; } 

int too(int t) { std::cout << "there" << std::endl; return t; } 

謝謝。

+0

插件:http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html –

回答

3

這意味着,在

template<class T , 
    class = typename std::enable_if<std::is_integral<T>::value>::type > 

情況下,它變得

template<class T , 
    class = void > 

如果條件std::is_integral<T>::valuetrue,因此功能被允許用於所述類型T,因此在過載分辨率參與。

如果條件不符合,則它變得非法並且typename std::enable_if<...>::type使類型爲T的函數無效。在您的例子,第一種方法允許所有整型(intunsignedlong,...),但沒有類等

第二,在你的榜樣int -only版本將失去一些信息和轉換價值無符號簽名或縮小某些值,這就是爲什麼在某些情況下第一個版本可能真的有用。

請注意,void實際上是std::enable_if的第二個參數的缺省值,這通常足以啓用或禁用模板等,因爲您並不需要特定的類型。您需要知道/檢測的是,它是否有效(void)或無效,在這種情況下::type零件沒有有效替代。

+0

一個相關的後續問題,何時無效還不夠? – Rickard

+1

@Rickard經典的例子是函數**的返回類型的SFINAE,例如'template std :: enable_if_t ,int> f(E e);'當一個函數模板只有一部分重載集合時'E'是一個枚舉並且返回'int'。 –

0

什麼是下面太職能的區別:

一個是可以要求任何複製構造類型的模板,在enable_if不僅制約它時,則使用默認模板參數:

#include <iostream> 

template<class T , 
     class = typename std::enable_if<std::is_integral<T>::value>::type > 
T too(T t) { std::cout << "here" << std::endl; return t; } 

int too(int t) { std::cout << "there" << std::endl; return t; } 

int main() 
{ 
    too<double, void>(1.0); 
} 
相關問題