gko*_*hyn 4 c++ templates extends class
我有一个函数,它有一个模板类作为参数:
template<class T> void scheduleTask(T* a);
Run Code Online (Sandbox Code Playgroud)
但是我希望调用此函数的类扩展类"Runnnable",在Java中你可以通过以下方式实现:
public <T extends Runnable> void scheduleTask(T a);
Run Code Online (Sandbox Code Playgroud)
如果可以,我将如何在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) {...}
Run Code Online (Sandbox Code Playgroud)
清理,给出一个很好的错误消息,但不影响重载解析:
template<typename T>
void scheduleTask(T *a) {
static_assert(std::is_base_of<Runnable, T>::value, "T must be derived from Runnable");
...
}
Run Code Online (Sandbox Code Playgroud)
这两个都需要C++ 11.我知道如果你无法访问C++ 11,Boost会有一些技巧.
也就是说,正如Jerry在评论中所说,根本不使用模板可能更有意义.如果你调查此事并且仍然确定你需要一个,这应该有效.