如何在CRTP的基类上模板化Derived类

iNF*_*TEi 2 c++ templates traits crtp

可以说,我有两个发动机类别(基于燃料类型,例如燃气或电动)

template<class Derived>
class ElectricEngine {};
Run Code Online (Sandbox Code Playgroud)

template <typename Derived>
class GasEngine {};
Run Code Online (Sandbox Code Playgroud)

现在说我想制作,CarEngine并且PlaneEngine每个都可以选择上述基类之一.我还需要做CRTP(静态多态).所以这样做的直接方法如下:

class ElectricCarEngine : public ElectricEngine<ElectricCarEngine> {};
class GasCarEngine : public GasEngine<GasCarEngine> {};

class ElectricPlaneEngine : public ElectricEngine<ElectricPlaneEngine> {};
class GasPlaneEngine : public GasEngine<GasPlaneEngine> {};
Run Code Online (Sandbox Code Playgroud)

以上作品,但其大量的冗余代码,因为我的每一个方法的CarEngine类型,即ElectricCarEngineGasCarEngine是一样的.它的故事ElectricPlaneEngineGasPlaneEngine.

假设下面的内容编译:

template <typename Base>
class CarEngineInterface : public Base<CarEngineInterface<Base> > {};
Run Code Online (Sandbox Code Playgroud)

然后我们可以重用此类来CarEngine通过简单的typedf 创建任何类型.例如:

typedef CarEngineInterface<ElectricCarEngine> ElectricCarEngine;
typedef CarEngineInterface<GasCarEngine> ElectricCarEngine;
Run Code Online (Sandbox Code Playgroud)

然而,由于循环依赖性,这会失败.我怎样才能达到类似的效果?

是否有一些特质可以解决这个问题?(与用于在CRTP中从基类引用派生类typedef的那些一样)

我在使用C++ 99,但我可以使用Boost.我也是c ++模板中的菜鸟.

如果我需要澄清任何事情,请告诉我.

Ideaone链接:https://ideone.com/uMylVY

jth*_*ill 6

模板也可以接受模板作为参数,所以我认为这将服务于:

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;
Run Code Online (Sandbox Code Playgroud)

这可能是在结构语法方面突破它的最简单方法,但它只是一种方法.尝试很多变化,看看以后会让生活变得最简单.