c++ - 模板可以扩展 C++ 函数中的类吗?

标签 c++ class templates extends

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

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/

相关文章:

c++ - 在发布/ Debug模式下,Haar 级联的不同结果

c++ - 通过分发目标文件加速编译

Java混淆器。类保留(不删除)但允许混淆

Python——检查对象是否是某个模块中任何类的实例

python - 将值发送到另一个文件

c++ - 模板别名-问题(C++之旅)

c++ - 如何让 const char* 函数工作?

c++ - C++ 和 OpenGL 矩阵顺序之间的混淆(行优先 vs 列优先)

c++ - 根据给定的 typedef 调用 std::to_string 或 std::to_wstring

c++ - 将一个未定义的类作为友元,然后再定义它