草庐IT

c++ - 使用 CRTP 时 clang++ 不接受使用模板模板参数

在使用带有CRTP的模板模板参数时,尝试在派生初始化列表中调用基类构造函数时遇到编译错误。可以用这段代码复制问题:templateclassDerived,classT>structbase{};templatestructderived:publicbase{derived():base(){}};有问题的错误消息:bug.cpp:10:16:error:templateargumentfortemplatetemplateparametermustbeaclasstemplateortypealiastemplate:base()^bug.cpp:10:11:error:expec

c++ - 保护 CRTP 模式免受 "pure virtual"调用中的堆栈溢出

考虑以下标准CRTP示例:#includetemplatestructBase{voidf(){static_cast(this)->f();}voidg(){static_cast(this)->g();}};structFoo:publicBase{voidf(){std::cout如果这是常规的虚拟继承,我可以标记虚拟f和g方法一样纯粹structBase{virtualvoidf()=0;virtualvoidg()=0;};并得到一个关于Foo的编译时错误是抽象的。但是CRTP没有提供这样的保护。我可以以某种方式实现它吗?运行时检查也是可以接受的。我想过比较this->f带有

c++ - 具有 protected 派生成员的 CRTP

在CRTPpattern,如果我们想将派生类中的实现函数保持为protected状态,就会遇到问题。我们必须要么将基类声明为派生类的友元,要么使用somethinglikethis(我没有尝试过链接文章上的方法)。是否有其他(简单)方法允许将派生类中的实现函数保持为protected状态?编辑:这是一个简单的代码示例:templateclassC{public:voidbase_foo(){static_cast(this)->foo();}};classD:publicC{protected://ERROR!voidfoo(){}};intmain(){Dd;d.base_foo()

c++ - 防止用户从不正确的 CRTP 基础派生

我想不出一个合适的问题标题来描述问题。希望下面的详细信息能清楚地解释我的问题。考虑下面的代码#includetemplateclassBase{public:voidcall(){static_cast(this)->call_impl();}};classD1:publicBase{public:voidcall_impl(){data_=100;std::cout//Thisiswrongbyintension{public:voidcall_impl(){std::cout它将通过D2的定义编译和运行是故意错误的。第一次来电d2.call_impl()将输出一些随机位,预计为D2

C++ 静态多态性 (CRTP) 和使用派生类的 typedef

我阅读了Wikipediaarticle关于C++中用于执行静态(阅读:编译时)多态性的奇怪重复模板模式。我想对其进行概括,以便可以根据派生类型更改函数的返回类型。(这似乎应该是可能的,因为基类型知道模板参数的派生类型)。不幸的是,以下代码无法使用MSVC2010编译(我现在无法轻松访问gcc,所以我还没有尝试过)。有人知道为什么吗?templateclassbase{public:typedeftypenamederived_t::value_typevalue_type;value_typefoo(){returnstatic_cast(this)->foo();}};templa

c++ - 什么是奇怪的重复模板模式(CRTP)?

不引用一本书,谁能通过代码示例对CRTP提供一个很好的解释? 最佳答案 简而言之,CRTP是当一个类A有一个基类,它是类A的模板特化本身。例如templateclassX{...};classA:publicX{...};奇怪地反复出现,不是吗?:)现在,这给了你什么?这实际上给出了X模板能够成为其特化的基类。例如,您可以像这样制作一个通用的单例类(简化版)templateclassSingleton{public:staticActualClass&GetInstance(){if(p==nullptr)p=newActualCl

c++ - operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数不会在C++中被继承。但显然,赋值operator=并不太...这是什么原因?是否有任何解决方法来继承赋值运算符?operator+=,operator-=,...也是这样吗?是否所有其他函数(除了构造函数/operator=)都是继承的?其实我是在做CRTP的时候遇到这个问题的:templateclassBase{inlineCrtp&operator=(constBase&rhs){/*SOMETHING*/;returnstatic_cast(*this);}};classDerived1:publicBase{};classDerive

c++ - operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数不会在C++中被继承。但显然,赋值operator=并不太...这是什么原因?是否有任何解决方法来继承赋值运算符?operator+=,operator-=,...也是这样吗?是否所有其他函数(除了构造函数/operator=)都是继承的?其实我是在做CRTP的时候遇到这个问题的:templateclassBase{inlineCrtp&operator=(constBase&rhs){/*SOMETHING*/;returnstatic_cast(*this);}};classDerived1:publicBase{};classDerive

c++ - GCC 无法区分 operator++() 和 operator++(int)

templatestructPre{CRTP&operator++();};templatestructPost{CRTPoperator++(int);};structDerived:Pre,Post{};intmain(){Derivedd;d++;++d;}我从GCC收到这些错误::Infunction'intmain()'::18:10:error:requestformember'operator++'isambiguousd++;^~:8:14:note:candidatesare:CRTPPost::operator++(int)[withCRTP=Derived]CRT

c++ - GCC 无法区分 operator++() 和 operator++(int)

templatestructPre{CRTP&operator++();};templatestructPost{CRTPoperator++(int);};structDerived:Pre,Post{};intmain(){Derivedd;d++;++d;}我从GCC收到这些错误::Infunction'intmain()'::18:10:error:requestformember'operator++'isambiguousd++;^~:8:14:note:candidatesare:CRTPPost::operator++(int)[withCRTP=Derived]CRT