繁体   English   中英

如何使派生类在CRTP中以基类为模板

[英]How to make Derived class templated on Base class in CRTP

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

template<class Derived>
class ElectricEngine {};

template <typename Derived>
class GasEngine {};

现在说我要制作CarEnginePlaneEngine ,它们每个都可以选择上述基础类之一。 我还需要做CRTP(静态多态性)。 因此,执行此操作的直接方法如下:

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

class ElectricPlaneEngine : public ElectricEngine<ElectricPlaneEngine> {};
class GasPlaneEngine : public GasEngine<GasPlaneEngine> {};

上面的方法有效,但是它有很多冗余代码,因为我每种CarEngine类型的方法(即ElectricCarEngineGasCarEngine都是相同的。 对于ElectricPlaneEngineGasPlaneEngine

假设像下面这样编译:

template <typename Base>
class CarEngineInterface : public Base<CarEngineInterface<Base> > {};

然后,我们可以通过简单的typedfs重用此类以创建任何CarEngine Types。 例如:

typedef CarEngineInterface<ElectricCarEngine> ElectricCarEngine;
typedef CarEngineInterface<GasCarEngine> ElectricCarEngine;

但是,由于循环依赖性,此操作失败。 如何获得类似的效果?

有一些特质可以解决这个问题吗? (就像那些用来引用CRTP中基类的派生类typedef的类一样)

我使用的是C ++ 99,但可以使用Boost。 我也是C ++模板的菜鸟。

让我知道是否需要澄清任何事情。

Ideaone链接: 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;

从结构语法的角度来看,这可能是最简单的方法,但这只是实现它的一种方法。 尝试多种变体,看看以后如何使生活变得最轻松。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM