jjzjj

c++ - 使用 CRTP 分离平台特定代码

我最近想到使用CRTP(奇怪的重复模板模式)分离不同平台特定的实现(可能是Win32/X、opengl/dx/vulkan等...):我想到了这样的事情:IDisplayDevice.h#pragmaonce#include"OSConfig.h"namespacecbn{template//Win32typeherestructIDisplayDevice{boolrun_frame(void){returnstatic_cast(this)->run_frame();}//alotofothermethods...};}Win32DisplayDevice.h:#pragmaonc

c++ - CRTP与完美转发

考虑CRTP的标准用法,对于某些表达式模板机制,它按值保留其子项:templatestructExpr{};templatestructCst:Expr>{Cst(Tvalue):value(std::move(value)){}private:Tvalue;};templatestructAdd:Expr>{Add(Ll,Rr):l(std::move(l)),r(std::move(r))private:Ll;Rr;};等等现在,在实现运算符时,我们必须通过引用传递,因为要将参数向下转换为正确的类型。问题是我发现自己实现了operator+的四个(!)版本:templateAddo

c++ - CRTP编译错误

以下将使用GCC5.2编译,但不能使用VisualStudio2015。templatestructCRTP{staticconstexprintnum=Derived::value+1;};structA:CRTP{staticconstexprintvalue=5;};它提示A没有名为value的成员。如何修复代码以便它在两个编译器上编译?还是完全违法? 最佳答案 尝试将其改为constexpr函数。您设置它的方式现在尝试访问不完整的类型。由于模板化成员函数只会在首次使用时进行初始化,类型A将在此时完全定义。#includete

c++ - 为什么在通过 CRTP 访问派生类中的 typedef 时出错?

我无法理解为什么下面的代码无法编译——有人可以解释一下吗?如何从基类访问派生类中的typedef?templatestructTest{templatetypenameDerived::value_typefoo(T);};structDerived:publicTest{typedefintvalue_type;}; 最佳答案 申报时Derived,Derived还不是一个完整的类型——您才刚刚开始声明它!因此在特化Test,模板参数是一个不完整的类型,因此您不能引用嵌套名称,例如Derived::value_type--这是循环

c++ - Concepts lite是否会改变CRTP实现静态多态的需求?

自从几年前我发现了CRTP以来,我在很多地方都使用它来为非常密集的面向计算的代码实现编译时多态性。当一个人关心运行时的通用性和最大性能时,以通用方式将成员函数“注入(inject)”到类中是很棒的。我在conceptslite上阅读/观看了几件事这将是(我希望)下一个C++标准的一部分。以更抽象和通用的方式设计功能绝对很棒,避免了我目前使用的SFINAE/std::enable_if的糟糕行。我还没有测试过实现概念的g++分支来玩弄它们,并以一种新的方式研究我喜欢的元编程方法。但也许你们中的一些人有。我的第一个想法是概念不会解决静态多态性的问题,但由于这类事情可能严重依赖技巧,我可能是

c++ - 调用父构造函数时如何避免模板参数上的样板

假设我有一个带有很多模板参数的类,其中之一是使用CRTP的派生类:templateclassBaseFoo{public:BaseFoo(A&a){}};我想继承它:classDerivedFoo:publicBaseFoo{public:DerivedFoo(A&a):BaseFoo(a){}};是否有任何技巧可以避免提及所有显式模板参数?如果我仍然必须声明Derived作为模板参数也没关系。 最佳答案 如果基类是依赖的,只需使用派生类的名称并在其中查找基类名称。如果它不依赖,您可以将基类命名为不合格的,因为它在范围内。不需要所有

c++ - CRTP 类中成员函数的可见性

我正在编写一个带有排序函数对象的排序库。主要类之一sorter_facade旨在根据已经存在的重载向排序器提供一些operator()重载。下面是一个简单的heap_sorter对象简化示例,实现了堆排序:structheap_sorter:sorter_facade{usingsorter_facade::operator();templateautooperator()(Iteratorfirst,Iteratorlast)const->void{std::make_heap(first,last);std::sort_heap(first,last);}};sorter_faca

c++ - 为什么编译器在使用 CRTP 时看不到基类的方法

我有以下代码:structIface{virtualintRead()=0;intRead(intx){returnRead()+x;}};templatestructCrtp:publicIface{virtualintRead(){returnstatic_cast(*this).ReadImpl();}//usingIface::Read;};structIfaceImpl:publicCrtp{intReadImpl(){return42;}};intmain(){IfaceImplimpl;impl.Read(24);//compilationerrorIface&iface

c++ - 在 CRTP 类中使用派生类型的成员

我有一个奇怪的重复出现的模板模式类和一个像这样的派生类:templateclassA{typedeftypenameDerived::CD;Dx;};classB:publicA{public:classC{};};编译失败是因为当编译器试图定义D时B没有被完全定义。我怎样才能获得类似的结果,即A的成员属于B中定义的类型?或者我是否必须强制在B之外定义C? 最佳答案 OrdoIhavetoforceCtobedefinedoutsideofB?是的,不幸的是你必须这样做。通常你可以在A之前定义一个模板类,并将它专门用于B,包含C类型

c++ - 为什么我的 Curiously Recurring Template Pattern (CRTP) 不能引用派生类的 typedef?

这个问题在这里已经有了答案:C++staticpolymorphism(CRTP)andusingtypedefsfromderivedclasses(5个答案)关闭9年前。使用curiouslyrecurringtemplatepattern时,如果我试图从基类中引用属于派生类的typedef,则仅无法引用它们;gcc提示notypenamed'myType'inclassDerived.这似乎与使用typedef、模板和奇怪的重复关系的其他方式不一致。考虑:/*crtp.cpp*/#includeusingnamespacestd;//case1.simple.classBase{