可以说,我有两种发动机等级(基于燃料类型,例如燃气或电动)
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> > {};
然后我们可以重用此类来通过简单的typedf创建任何CarEngine
类型。
例如:
typedef CarEngineInterface<ElectricCarEngine> ElectricCarEngine;
typedef CarEngineInterface<GasCarEngine> ElectricCarEngine;
然而,由于循环依赖性,这会失败。我怎样才能达到类似的效果?
是否有一些特质可以解决这个问题? (与用于在CRTP中从基类引用派生类typedef的那些一样)
我使用的是C ++ 99,但我可以使用Boost。我也是c ++模板中的菜鸟。
如果我需要澄清任何内容,请告诉我。
Ideaone链接:https://ideone.com/uMylVY
答案 0 :(得分: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;
这可能是在结构语法方面突破它的最简单方法,但它只是一种方法。尝试很多变化,看看以后会让生活变得最简单。