4

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

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

但我希望调用此函数的类扩展类“Runnnable”,在 Java 中,您可以通过以下方式执行此操作:

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

如果可以,我将如何在 C++ 中做到这一点?

4

1 回答 1

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) {...}

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 在评论中所说,完全不使用模板可能更有意义。如果您调查此事并且仍然确定您需要一个,这应该有效。

于 2013-07-15T04:05:41.933 回答