草庐IT

Shape_CRTP

全部标签

c++ - 将 CRTP 与 static_assert 一起使用时出现编译器错误

考虑以下代码:templatestructBase{staticconstexprintx_base=Derived::x_derived;//static_assert(x_base>1,"Oops");};structDerived:publicBase{staticconstexprintx_derived=5;};Baseobj;这在gcc上编译得很好,但如果我取消注释static_assert行,它会提示error:incompletetype'Derived'usedinnestednamespecifierstaticconstexprintx_base=Derived:

C++:使用 CRTP,派生类中定义的类在基类中不可访问

这是(简化的)基类:templateclassSharedObject{protected:QExplicitlySharedDataPointerd;};这是派生的:classThisWontCompile:publicSharedObject{private:friendclassSharedObject;structData:publicQSharedData{intid;};};是否有从SharedObject访问ThisWontCompile::Data的解决方法?从基础对象派生的对象到底能做什么,不能做什么? 最佳答案

c++ - 为什么这些 CRTP 模式中只有一个可以编译?

考虑以下两段带有CRTP的代码图案:templatestructBase1{intbaz(typenameDerived::value_type){return42;}};structFoo1:Base1{usingvalue_type=int;};templatestructBase2{autobaz(){returntypenameDerived::value_type{};}};structFoo2:Base2{usingvalue_type=int;};第一个failstocompile而第二个compiles.我的直觉告诉他们要么编译要么都不编译。现在,如果我们将Base2中

c++ - 如何实现编译时检查 CRTP 中的向下转换是否有效?

我有一个普通的旧CRPT(请不要被访问限制分心-问题不在于它们):templateclassBase{voidMethodToOverride(){//genericstuffhere}voidProblematicMethod(){static_cast(this)->MethodToOverride();}};像往常一样打算像这样使用:classConcreteDerived:publicBase{voidMethodToOverride(){//customstuffhere,thenmaybeBase::MethodToOverride();}};现在static_cast困扰

C++ 低延迟设计 : Function Dispatch v/s CRTP for Factory implementation

作为系统设计的一部分,我们需要实现工厂模式。结合工厂模式,我们还使用CRTP来提供一组基本功能,然后可以由派生类进行自定义。示例代码如下:classFactoryInterface{public:virtualvoiddoX()=0;};//forceallderivedclassestoimplementcustom_X_impltemplateclassCRTP:publicBase{public:voiddoX(){//docommonprocessing.....thenstatic_cast(this)->custom_X_impl();}};classDerived:pub

c++ - Clang 中带有静态 constexpr 的奇怪的循环模板模式 (CRTP)

考虑我下面的简单示例:#includetemplateclassBase{public:staticconstexprinty=T::x;};classDerived:publicBase{public:staticconstexprintx=5;};intmain(){std::cout在g++中,这可以正常编译并按预期打印5。然而,在Clang中,它无法编译并出现错误nomembernamed'x'in'Derived'。据我所知这是正确的代码。我正在做的事情有问题吗?如果没有,是否有办法在Clang中完成这项工作? 最佳答案

c++ - 没看懂Stroustup先生建议删除抽象类Shape的copy default和move操作

我试图理解作者在他的新书(TCPL第4版)中3.3.4SuppressingOperations中的建议,但无济于事。书摘Usingthedefaultcopyormoveforaclassinahierarchyistypicallyadisaster:Givenonlyapointertoabase,wesimplydon’tknowwhatmembersthederivedclasshas(§3.3.3),sowecan’tknowhowtocopythem.So,thebestthingtodoisusuallytodeletethedefaultcopyandmoveoper

c++ - 关于CRTP静态多态的困惑

我正在努力研究CRTP。周围有一些很好的资源,包括这个论坛,但我想我对静态多态性的基础知识有些困惑。查看以下维基百科条目:templatestructBase{voidimplementation(){//...static_cast(this)->implementation();//...}staticvoidstatic_func(){//...T::static_sub_func();//...}};structDerived:publicBase{voidimplementation();staticvoidstatic_sub_func();};我知道这有助于我在派生类中有

c++ - 有什么比元工厂更好的解决构造函数注入(inject)到 CRTP 中的派生类的问题吗?

在CRTP,我想干净利落地将构造函数注入(inject)派生类——不使用宏,也不写出来。这似乎是不可能的,所以我想出了一些解决方法。首先,有一个基础eventclass(QEvent)每个派生类(seerationale)应该有一个唯一的整数类型标签。您可以通过调用注册函数来获取它。创建一个CRTP包装器可以很容易地向您隐藏它:templateclassEventWrapper:publicQEvent{public:EventWrapper():QEvent(staticType()){}staticQEvent::TypestaticType(){staticQEvent::Typ

c++ - 如何按照 MISRA C++ 实现 CRTP

我的团队正在开发一个嵌入式系统,我们需要遵循MISRAC++。我们正在重构代码以使用更少的虚拟方法,因此我们正在尝试实现CRTP以使用静态多态性而不是动态多态性。但是我们有静态多态性需要指针转换的问题,所以我们的静态分析检查器会提示。这是界面templateclassUpdateMethod{protected:~UpdateMethod(){}public:voidoperator()()const{//[MISRARule5-2-7]violation:static_cast(this)->update();}};这是其中一个实现:classA:publicUpdateMethod