C++ 类继承和模板

标签 c++ templates inheritance

我想在我的 C++ 程序中编写如下内容:

class A {
 public:
   void a();
}

template <class B extends A>
class C {
 B instance;
}

这可能吗?换句话说:C++ 允许我说模板中的类是其他类的子类吗?

最佳答案

定义一个名为 extends 的元函数(这只是一个糖衣名字)如:

template<typename D, typename B>
using extends = std::is_base_of<B,D>;

然后将您的类定义为:

template <class B>
class C 
{
   //here you can check it, and generate your own error message!
   static_assert(extends<B,A>(), 
                "Constraint Violation: B doesn't derive from A.");

   B instance;
};

或者,你可以这样写:

//define it a bit differently now!
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;

template <class B, class Unused=extends<B,A>>
class C 
{
      B instance;
};

但在这种情况下,您没有机会生成自己的错误消息。编译器可以随意向您抛出任何错误消息,这可能难以理解。

无论如何,您可能意识到可以使用 std::is_base_of<>直接地。但如果你正在寻找糖衣名字,那么extends听起来不错!

关于C++ 类继承和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20266052/

相关文章:

c++ - 是否可以在 Windows 上静态链接 Qt::phonon?

c++ - C : performance of pthread, 低于单线程

c++ - 表达式模板 : improving performance in evaluating expressions?

c++ - 使用条件调用模板函数

c++ - 从奇怪的模板类型转换

python - 使用父类方法继承,不调用父类

c# - 从父类型列表中获取派生类型

c++ - ICU UnicodeString 到 Locale 编码

c++ - 使用 LDAP 中的页面控制获取 Active Directory 组中的所有用户 ID - native api

c++ - 从派生类访问基类保护的嵌套类