我有一个以模板类作为参数的函数:
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) {...}
Cleaner,给出一个很好的错误消息,但不影响重载决议:
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 有一些技巧可以解决这个问题。
也就是说,正如 Jerry 在评论中所说,根本不使用模板可能更有意义。如果您调查了此事并仍然确定您需要一个,那么这应该可行。
关于c++ - 模板可以扩展 C++ 函数中的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646558/