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

时间:2013-07-15 03:58:24

标签: c++ class templates extends

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

template<class T> void scheduleTask(T* a);

但我希望调用此函数的类扩展类“Runnnable”,在Java中你可以通过以下方式实现:

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

如果可以,我将如何在c ++中执行此操作?

1 个答案:

答案 0 :(得分:7)

您可以使用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就会有一些技巧。

那就是说,正如杰瑞在评论中所说,根本不使用模板可能更有意义。如果你调查此事并且仍然确定你需要一个,这应该有效。