动态编译时基类

Dynamic compile-time base class

本文关键字:基类 编译 动态      更新时间:2023-10-16

请注意,这只是一个关于模板语法的问题 - 不是一般的C ++面向对象,多态性设计。这个例子是为此目的而捏造的

假设我有一个基类:

class A: public B
{
...
};

我用它...

A a;
a.DoSomething();

如果我想做这样的事情,以便能够对 A 进行编译时派生,不仅来自 B,而且来自其他类。这样我就可以这样使用它:

A<B> a;                // like class A : public B
a.doSomething();
A<C> ac;              // like class A : public C
ac.DoSomething();

我可以做这样的事情吗?

template <typename BASECLASS>
class A : public BASECLASS
{
...
};

假设我的构造函数有一个参数,并且我知道我用于基类的任何模板都具有相同的签名。如果是这样,这是 *.h 文件,如何处理 *.cpp 文件?初始化构造函数是否合法?

A::A(int param) : BASECLASS(param)
{
}

请注意,这只是一个关于模板语法的问题 - 而不是一般的C ++面向对象,多态设计。

您在示例中的语法正确。 下面是一个最小的可编译示例。

template <class Base>
class A : public Base {
};
class B {
public:
  void doSomething() {}
};
class C {
public:
  void doSomething() {}
};
int main() {
  A<B> a;                // like class A : public B
  a.doSomething();
  A<C> ac;              // like class A : public C
  ac.doSomething(); 
}
实际上

,有了 C++11,这变得更加容易:

template <typename T>
class A: public T {
public:
    template <typename... Args>
    explicit A(Args&&... args): T(std::forward<Args>(args)...) {}
};

这种可变参数模板参数(typename...)与引用折叠(模板中的&&推导出最佳引用匹配)和std::forward的使用允许完美的转发;就好像A的构造函数的"层"是透明的一样。