C++:从template参数继承类

use*_*652 18 c++ inheritance templates design-patterns

我最近看到了以下C++代码片段

template <class B>
class A : public B
{
   ...
};
Run Code Online (Sandbox Code Playgroud)

我想知道这样的设计在哪种设置中是好的做法?

我理解它的方式是,将超类作为模板参数允许A的用户在实例化A的对象时选择超类.

但是如果是这种情况,那么为所有用作模板参数并具有A扩展C的类(B)的公共超类C不是更好吗?

han*_*aad 13

它经常用于实现静态多态性.

用例是:

通常,您可以从动态多态中获益,而无需虚拟函数的额外运行时成本.但只有在编译时才能确定具体类型,它才有用.

  • 可能值得注意的是,CRTP 的做法正好相反,如 OP 的示例所示。 (2认同)

vz0*_*vz0 5

听起来像是包装类的一个很好的候选者:

class base {
public:
  virtual void f() = 0;
};

class d1 : public base {
public:
  virtual void f() override { ... };
};

class d2 : public base {
public:
  virtual void f() override { ... };
};

template <typename T>
class wrapper : public T {
public:
  virtual void f() override {
    pre_op();
    T::f();
    post_op();
  }

private:
  void pre_op() { ... }
  void post_op() { ... }
}

int main(int, char**) {
  wrapper<d1> w1;
}
Run Code Online (Sandbox Code Playgroud)

例如,包装类可以提供对派生类的同步访问。

  • 既继承又拥有相同类型的成员似乎有些浪费,为什么不直接调用父成员函数`T::f()`? (3认同)