动态编译时基类

时间:2013-12-20 19:18:53

标签: c++

请注意这是一个关于模板语法的问题 - 不是一般的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 ++面向对象,多态设计。

2 个答案:

答案 0 :(得分:1)

您的示例中的语法正确。这是一个最小的可编辑示例。

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(); 
}

答案 1 :(得分:0)

实际上,使用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的构造函数的“层”是透明的。