2012-09-03 120 views
4

考慮到類模板,可以使用類型特徵和虛擬啓用程序模板參數爲特定類型的組提供模板特化。我已經asked that earlier函數模板:具有類型特徵的不同特化

現在,我需要爲函數模板做同樣的事情:也就是說,我有一個模板函數,並希望針對一組類型進行專門化,例如,類X的子類型的所有類型。我可以用型性狀這樣表達的:

std::enable_if<std::is_base_of<X, T>::value>::type 

我想過做這樣說:

template <typename T, typename ENABLE = void> 
void foo(){ 
    //Do something 
} 

template <typename T> 
void foo<T,std::enable_if<std::is_base_of<A, T>::value>::type>(){ 
    //Do something different 
} 

然而,這不起作用,因爲偏特不允許函數模板。那麼怎麼做呢?也許一個默認參數的類型trait類型?但是代碼看起來如何呢?

+0

什麼是你真正使用這個呢?傾向於重載函數而不是專門化他們的模板。希望你的預期用法允許。 –

回答

2

最近你在問什麼是enable_if返回類型:

template<typename T> typename std::enable_if<std::is_same<T, int>::value>::type foo(); 
template<typename T> typename std::enable_if<std::is_same<T, char>::value>::type foo(); 

然而,指派給一個輔助函數或類可能是更具可讀性和效率。

輔助功能:

template<typename T> void foo_helper(std::true_type); 
template<typename T> void foo_helper(std::false_type); 
template<typename T> void foo() { foo_helper(std::is_same<T, int>()); } 

Helper類:

template<typename T, bool = std::is_same<T, int>::value> struct foo_helper {}; 
template<typename T> struct foo_helper<T, true> { static void foo(); }; 
template<typename T> struct foo_helper<T, false> { static void foo(); }; 
template<typename T> void foo() { foo_helper<T>::foo(); } 
+0

好吧,通過使用返回類型,我甚至可以省略默認參數 – gexicide

+1

@gexicide,但是,您必須針對每個函數定義進行專門化,因此您失去了像您可以擁有「全部捕捉」定義的能力類模板。 –

4

重載:

void foo_impl(T, std::false_type); 

void foo_impl(T, std::true_type); 

foo(T t) { foo_impl(t, std::is_base_of<A, T>()); } 
0

不要在類模板的實際執行情況(部分特例等),並寫一個小包裝的模板函數,它只是在你的類模板調用靜態函數。

0

嘗試了一些東西,終於想出了正確的語法自己 - 對不起,問。我不知道enable_if有第二個參數。通過使用這個參數和一個默認值,這是可能的。

下面是答案

template<typename T> 
void foo(typename std::enable_if<std::is_base_of<A, T>::value,int>::type ENABLER = 0){ 
    std::cout << "T is a subclass of A!"; 
} 

template<typename T> 
void foo(typename std::enable_if<!std::is_base_of<A, T>::value,int>::type ENABLER = 0){ 
    std::cout << "T is NOT a subclass of A"; 
} 
+0

再一次,你失去了一般情況。 –

+0

什麼一般情況下? – gexicide

相關問題