C++ 模板是否可以扩展C+中的类+;功能?

C++ 模板是否可以扩展C+中的类+;功能?,c++,class,templates,extends,C++,Class,Templates,Extends,我有一个以模板类作为参数的函数: template<class T> void scheduleTask(T* a); 模板无效调度任务(T*a); 但我希望调用此函数的类扩展类“RunnTable”,在Java中,您可以通过以下方式实现: public <T extends Runnable> void scheduleTask(T a); publicsvoidscheduletask(ta); >强制执行这个限制。你有两个选择如何使用它 使用SFINAE影

我有一个以模板类作为参数的函数:

template<class T> void scheduleTask(T* a);
模板无效调度任务(T*a);
但我希望调用此函数的类扩展类“RunnTable”,在Java中,您可以通过以下方式实现:

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

<如果我可以,我怎么在C++中这样做?

你有可能用<代码> STD::iSuxBase< < /C> >强制执行这个限制。你有两个选择如何使用它

使用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");
    ...
}
模板
无效调度任务(T*a){…}
Cleaner,提供了一条很好的错误消息,但不影响过载解决方案:

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");
    ...
}
模板
无效调度任务(T*a){
static_assert(std::is_base_of::value,“T必须从Runnable派生”);
...
}
这两者都需要C++11。我知道,如果您没有访问C++11的权限,Boost在这方面有一些技巧


也就是说,正如Jerry在评论中所说,完全不使用模板可能更有意义。如果您调查了这件事,并且仍然确定需要一个,那么这应该是可行的。

可能的重复:您希望所谓的扩展(大概您的意思是“派生自”)是可运行的,还是希望在派生自的东西上实例化?如果是这样,你可能犯了一个错误,试图用C++编写java。模板的基本要点是允许对满足其要求的任何内容进行实例化。如果您想要从“Runanble”派生的内容,请传递一个“Runanble*”或“Runnable&”,并且不要使用模板。谢谢,我忘记了我可以使用它而不是模板。必须为std::enable\u If和std::is_base\u of添加include。@user1056903,实际上,它们在
中。