我有了一个模板类作为参数的函数:模板可以在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