我有了一個模板類作爲參數的函數:模板可以在C++函數中擴展一個類嗎?
template<class T> void scheduleTask(T* a);
但我想誰調用這個函數來擴展類「Runnnable」之類,在Java中,你可以這樣做:
public <T extends Runnable> void scheduleTask(T a);
如果可以,我會如何在C++中做到這一點?
我有了一個模板類作爲參數的函數:模板可以在C++函數中擴展一個類嗎?
template<class T> void scheduleTask(T* a);
但我想誰調用這個函數來擴展類「Runnnable」之類,在Java中,你可以這樣做:
public <T extends Runnable> void scheduleTask(T a);
如果可以,我會如何在C++中做到這一點?
您可以通過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有一些技巧圍繞這個問題。
也就是說,正如傑裏在評論中所說,根本不使用模板可能更有意義。如果你研究這個問題,並確定你需要一個,這應該工作。
必須爲std :: enable_if和std :: is_base_of添加#include
@ user1056903,其實他們在'
可能的重複:http://stackoverflow.com/q/2631585/951890 –
你想要什麼*調用*它擴展(大概你的意思是「派生自」)runnable,或者你想實例化的東西是派生自?如果是這樣,你可能犯了一個錯誤,試圖用C++編寫Java。模板的基本點是允許實例化滿足其要求的任何事物。如果你想從「Runanble」派生一些東西,傳遞一個「Runanble *」或「Runnable&」,並且根本不使用模板。 –
謝謝,我忘了我可以使用它而不是模板。 – gkovalechyn