2013-07-15 135 views
3

我有了一個模板類作爲參數的函數:模板可以在C++函數中擴展一個類嗎?

template<class T> void scheduleTask(T* a); 

但我想誰調用這個函數來擴展類「Runnnable」之類,在Java中,你可以這樣做:

public <T extends Runnable> void scheduleTask(T a); 

如果可以,我會如何在C++中做到這一點?

+0

可能的重複:http://stackoverflow.com/q/2631585/951890 –

+5

你想要什麼*調用*它擴展(大概你的意思是「派生自」)runnable,或者你想實例化的東西是派生自?如果是這樣,你可能犯了一個錯誤,試圖用C++編寫Java。模板的基本點是允許實例化滿足其要求的任何事物。如果你想從「Runanble」派生一些東西,傳遞一個「Runanble *」或「Runnable&」,並且根本不使用模板。 –

+0

謝謝,我忘了我可以使用它而不是模板。 – gkovalechyn

回答

7

您可以通過std::is_base_of執行此限制。你有兩個選擇你如何使用它。

影響重載解析與SFINAE:

template<typename T, typename = typename std::enable_if<std::is_base_of<Runnable, T>::value, T>::type> 
void scheduleTask(T *a) {...} 

清潔,給人以不錯的錯誤信息,但不影響重載解析:

template<typename T> 
void scheduleTask(T *a) { 
    static_assert(std::is_base_of<Runnable, T>::value, "T must be derived from Runnable"); 
    ... 
} 

這兩種需要C++ 11。我知道如果你不能訪問C++ 11,Boost有一些技巧圍繞這個問題。

也就是說,正如傑裏在評論中所說,根本不使用模板可能更有意義。如果你研究這個問題,並確定你需要一個,這應該工作。

+0

必須爲std :: enable_if和std :: is_base_of添加#include 。 – user1056903

+0

@ user1056903,其實他們在''。 – chris

相關問題