【问题标题】:Can a template extend a class in a C++ function?模板可以在 C++ 函数中扩展类吗?
【发布时间】:2013-07-15 03:58:24
【问题描述】:

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

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

但我希望调用此函数的类扩展“Runnnable”类,在 Java 中您可以这样做:

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

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

【问题讨论】:

  • 您希望 所谓的 扩展(大概您的意思是“派生自”)可运行,或者您希望对派生的东西进行实例化?如果是这样,您可能会犯一个错误,尝试用 C++ 编写 Java。模板的基本点是允许对满足其要求的任何内容进行实例化。如果您想要从“Runanble”派生的东西,请传递“Runanble *”或“Runnable &”,并且根本不要使用模板。
  • 谢谢,我忘了我可以用它代替模板。

标签: c++ class templates extends


【解决方案1】:

您可以使用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 有一些技巧可以解决这个问题。

也就是说,正如 Jerry 在 cmets 中所说,完全不使用模板可能更有意义。如果您调查此事并仍然确定您需要一个,这应该可以工作。

【讨论】:

  • #include 必须为 std::enable_if 和 std::is_base_of 添加。
  • @user1056903,其实他们在&lt;type_traits&gt;
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 2016-08-16
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多