我想使用CRTP成语使用静态多态性,同时可以在运行时选择哪种实现。让我举个例子:我有一些课程负责计算内容:templateclassFooInterface{public:voidcompute(){(static_cast(this))->compute();}};classFooForward:publicFooInterface{public:voidcompute(){//dostuff}};classFooBackward:publicFooInterface{public:voidcompute(){//dootherstuff}};和templateclassBarInterfa
我在提出这个问题之后问这个问题here.要点很简单。假设您有两个此类:templateclassBase{...operatorconstDerived&()const{returnstatic_cast(*this);}...};classSpecialization:publicBase{...};然后假设你有一个像这样的类型转换:templatefunctionCall(constBase¶m){constT&val(param);...}问题是:这种转换的符合标准的行为应该是什么?应该和constT&val(static_cast(param))一样吗?还是应该递归迭代
在VC++10中,以下示例失败并出现错误C2027:“使用未定义的类型‘X’”。然而g++4.6编译它就好了。templateclassC{staticconstsize_tsize=sizeof(T);};classX:publicC{};那么哪个是对的呢?我该怎么做才能让它在主流编译器上运行?不过这没什么大不了的,因为VC++仍然允许在C的成员函数中使用sizeof(T)。我只需要重复一些很烦人的长类型定义。编辑:我意识到我的示例很糟糕,因为我真正想做的是使用大小作为编译时间常量,以这种方式:templateclassC2{};templateclassC{typedefC2A;}
我遇到了模板类中循环依赖的问题。有一个代码示例:templatestructA{typedeftypenameT::CD;//typenameT::Cc;};structB:publicA{structC{};};当我尝试实例化B时,出现编译器错误:“C”不是“B”的成员(MSVC)或Invaliduseofincompletetype'structB'(海湾合作委员会)。更改示例以使其正常工作的最佳方法是什么? 最佳答案 structB_base{structC{};};strucrB:A,B_base{};
我有一组实现相同业务方法的类。由于性能原因,我打算使用CRTP而不是虚拟调度。但我想保持编码的便利性,将其编码到带有继承和虚拟方法的单个接口(interface)。是否可以让我的专用类继承自使用CRTP保存公共(public)代码的模板化抽象类,以及继承自纯虚拟类,这样我就可以创建每种类型的实例,但让我的客户端代码依赖只在界面上?更好的是,我如何使用CRTP为客户端代码提供单一接口(interface),同时具有多个实现? 最佳答案 当然。您可以使用这样的方法,这是完全有效的:classInterface{public:virtua
CRTP模式中的基类可以访问派生类的成员函数,但不能访问派生类中的嵌套类型。为什么会有这种差异?为了说明,请考虑以下代码:templatestructcrtp_base{voidcrtp_method(){returnstatic_cast(*this).method();}//compilesusingcrtp_type=typenameDerived::type;//doesn'tcompile};structX:publiccrtp_base{voidmethod(){}usingtype=int;};intmain(){}crtp_type导致编译错误,而crtp_method
我正在尝试使用CRTP,但我对以下代码无法编译的原因感到困惑。templateclassCBase>structComponentX:publicCBase{//ThisdoesNOTcompile};templateclassCBase>structComponentY:publicCBase{//Thisdoescompile};你知道在CRTP的情况下模板模板参数是否有一些限制吗? 最佳答案 类模板名称代表“当前特化”(即它是一个注入(inject)的类名)仅在打开{之后类模板定义,在其范围内。在此之前,它是一个模板名称。所以
我想要一个具有多种可能实现的接口(interface),在编译时选择。我看到CRTP是实现它的首选习惯用法。这是为什么?另一种方法是策略模式,但我在任何地方都看不到这种技术的提及:templateclassStrategyInterface{public:voidInterface(){impl.Implementation();}voidBrokenInterface(){impl.BrokenImplementation();}private:Implimpl;};classStrategyImplementation{public:voidImplementation(){}};
假设我有一个克隆派生类的基类:classBase{public:virtualBase*clone(){returnnewBase();}//...};我有一组派生类,它们是使用一种奇怪的重复模板模式实现的:templateclassCRTP:publicBase{public:virtualT*clone(){returnnewT();}//...};我试图从中进一步得出这样的结论:classDerived:publicCRTP{public://...};我得到的编译错误是:errorC2555:'CRTP::clone':overridingvirtualfunctionretu
我正在尝试使用CRTP实现编译时多态性,并希望强制派生类实现该功能。目前的实现是这样的。templatestructbase{voidf(){static_cast(this)->f();}};structderived:base{voidf(){...}};在此实现中,如果派生类未实现f(),则对该函数的调用将陷入无限循环。如何强制派生类像纯虚函数一样实现函数?我尝试使用像static_assert(&base::f!=&Derived::f,"...")这样的“static_assert”,但它生成一条错误消息,指出两个成员函数指针指向不同的类的成员函数没有可比性。