首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态编译时基类

动态编译时基类
EN

Stack Overflow用户
提问于 2013-12-20 19:18:52
回答 2查看 163关注 0票数 4

请注意,这只是一个关于模板语法的问题--不是一般的面向c++对象的多态设计。这个例子就是为了这个目的而制作的

假设我有一个基类:

代码语言:javascript
复制
class A: public B
{
...
};

我用它..。

代码语言:javascript
复制
A a;
a.DoSomething();

如果我想做这样的事情,就能在编译时派生出A,不仅是从B,而且是从其他类。这样我就可以像这样使用它:

代码语言:javascript
复制
A<B> a;                // like class A : public B
a.doSomething();

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

我能做这样的事吗?

代码语言:javascript
复制
template <typename BASECLASS>
class A : public BASECLASS
{
...
};

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

代码语言:javascript
复制
A::A(int param) : BASECLASS(param)
{

}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-20 19:23:05

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-12-20 19:34:36

实际上,使用C++11,这变得更加容易了:

代码语言:javascript
复制
template <typename T>
class A: public T {
public:
    template <typename... Args>
    explicit A(Args&&... args): T(std::forward<Args>(args)...) {}

};

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20710534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档