如何在 CRTP 中的基类上使派生类模板化
How to make Derived class templated on Base class in CRTP
假设,我有两个发动机类别(基于燃料类型,例如燃气或电力)
template<class Derived>
class ElectricEngine {};
和
template <typename Derived>
class GasEngine {};
现在假设我想做CarEngine
和PlaneEngine
,每个基类都可以选择上述基类之一。我还需要做CRTP(静态多态性)。因此,执行此操作的直接方法如下:
class ElectricCarEngine : public ElectricEngine<ElectricCarEngine> {};
class GasCarEngine : public GasEngine<GasCarEngine> {};
class ElectricPlaneEngine : public ElectricEngine<ElectricPlaneEngine> {};
class GasPlaneEngine : public GasEngine<GasPlaneEngine> {};
上述方法有效,但它有很多冗余代码,因为我每种CarEngine
类型的方法,即ElectricCarEngine
和GasCarEngine
是相同的。ElectricPlaneEngine
和GasPlaneEngine
的故事是一样的.
假设编译如下:
template <typename Base>
class CarEngineInterface : public Base<CarEngineInterface<Base> > {};
然后,我们可以重用这个类来通过简单的typedfs创建任何CarEngine
类型。例如:
typedef CarEngineInterface<ElectricCarEngine> ElectricCarEngine;
typedef CarEngineInterface<GasCarEngine> ElectricCarEngine;
但是,由于循环依赖,这失败了。如何实现类似的效果?
有一些特质魔法可以解决这个问题吗?(就像那些用于从 CRTP 中的基类引用派生类类型定义一样)
我在 C++99 上,但我可以使用 Boost。我也是 c++ 模板的菜鸟。
如果我需要澄清任何事情,请告诉我。
创意链接:https://ideone.com/uMylVY
模板也可以接受模板作为参数,所以我认为这将起到:
template< class Engine > struct ElectricFueled { };
template< class Engine > struct GasFueled { };
template< template<class> class Fueled > struct CarEngine : Fueled<CarEngine<Fueled> > { };
template< template<class> class Fueled > struct PlaneEngine : Fueled<PlaneEngine<Fueled> > { };
CarEngine<ElectricFueled> myTeslaEngine;
PlaneEngine<GasFueled> myMooneyEngine;
这可能是在结构语法方面分解它的最简单方法,但这只是一种方法。 尝试很多变化,看看什么会让以后的生活变得最轻松。
相关文章:
- 如何通过派生类函数更改基类中的向量
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么此派生对象无法访问基类的后递减方法?
- 使用基类中的派生方法运行线程,而无需使用模板
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 在派生类中使用基类的私有成员变量的最佳方法
- 基类和派生类的多态赋值运算符
- 如何在从抽象基派生的类中实现相同的方法?
- 基类的填充将被复制到派生类中
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 指向基类派生类的 std::unique_ptr 的指针
- 为什么基类数据在派生类数据之前初始化
- c++ 派生基类 Friend 函数访问父级上的私有函数
- 如何将基类替换为派生基类
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 解析公用派生基类模板中的函数模板名称时出错"Not declared in this scope"