动态编译时基类
Dynamic compile-time base class
请注意,这只是一个关于模板语法的问题 - 不是一般的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的构造函数的"层"是透明的一样。
相关文章:
- 检查该类在编译时C++中是否有任何基类
- 创建并编译基类以在其他 C++ 项目 (ROS) 中使用
- 给定基类方法的编译时重写
- 在编译时计算基类的偏移量
- 尝试访问基类的受保护数据成员时出现编译错误
- 无法使用在模板化基类 [C++] 中声明的枚举编译代码
- 如果未实现虚函数,则大多数派生类无法编译,但如果一个基类未实现虚函数,则可以编译
- 获取多重继承中基类的编译时常量偏移量
- 在C++中,为什么编译器不了解基类对象在编译时指向哪个对象?
- 在编译时查找基类
- 动态编译时基类
- 重新编译二进制类或派生类,以便在基类中添加新方法
- 调用一个空基类函数,编译时会发生什么
- 编译时基类指针偏移到派生类
- 编译时检查基类是否为"接口"
- 在C++11中显式删除了成员函数后,从不可编译的基类继承是否仍然值得
- 基类更改后重新编译
- 如何在编译时检测基类的模板参数(针对错误)
- 在派生指针上显式调用基类析构函数时编译错误
- 如何维护从基类派生的所有类型的编译时列表?