草庐IT

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++ - 关于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

C++ CRTP虚函数点实例化

我试图了解一个简单的CRTP模式是否符合标准。下面的代码按预期编译和工作(在clang上)。但我对相关标准章节/段落的理解是虚函数CRTP::DoSomething()的实例化点应该在代码的(B)点,那里没有完整的Derived声明。因此内部的typedef类型也不应该可用。谁能指出验证此代码的相关标准章节?换句话说,在这种情况下,虚函数被实例化了ATFERC点?非常感谢您提供任何见解。弗朗西斯科//-------------------------//STARTCODE#includestructType1{};structType2{};structBase{virtual~Bas

c++ - std::declval vs crtp,无法从不完整类型推断方法返回类型

我正在尝试做这样的事情(在c++11中):#includetemplatestructbase{usingtype=decltype(std::declval().foo());};structbar:base{intfoo(){return42;}};intmain(){bar::typex;}失败了prog.cc:Ininstantiationof'structbase':prog.cc:8:14:requiredfromhereprog.cc:5:46:error:invaliduseofincompletetype'structbar'usingtype=decltype(st

c++ - CRTP和c++1y返回类型推导

我最近在玩CRTP,当我在使用c++1y类型被推断的函数时遇到了一些令我惊讶的事情。以下代码有效:templatestructBase{autofoo(){returnstatic_cast(this)->foo_impl();}};structDerived:publicBase{autofoo_impl()->int{return0;}};intmain(){Derivedb;inti=b.foo();(void)i;}我假设返回类型来自Base::foo是decltype返回的表达式,但如果我修改函数foo像这样:autofoo()->decltype(static_cast(t