草庐IT

c++ - 如何避免简单的递归模板类型定义

我有以下简单的问题:A类templateParser它定义了一个ModuleType作为Module.我想将解析器类型注入(inject)模块,以便能够从其中的解析器中再次提取几种类型。这很方便,因为Module中只需要一个模板参数。但是如果解析器需要一些在模块中定义的类型,例如OptionsType,问题就来了。,在Parser中访问它通过使用声明usingModuleOptions=...显然不适用于派生类的实例化ParserDerived.错误:error:notypenamed‘DType’in‘structParserDerived’usingDType=typenamePa

c++ - 推断可变参数模板的参数类型?

有没有一种方法可以推断列表的类型以避免必须传递列表应该是的参数类型,只需从第一个元素类型推断它。templatestructCalc{//dostuffwithArgs};//Usage:Calc::value;typenameCalc{};//errorTundefined//Desired:Calc::value;//autodeducedT=intCalc::value;//autodeducedT=float有什么方法可以获得所需的行为,还是我必须将类型作为参数包含在内? 最佳答案 按照Quentin的建议,这里有一个类示例

c++ - 什么时候将全局变量的地址作为模板参数传递有用?

我最近看了一段来自Microsoft的视频,解释了C++17的一些新特性,我很想找到C++14(甚至可能更早?)的一个特性,它允许你使用地址全局变量作为模板参数的常量表达式。这允许如下代码:#includeintg_iTest=5;templatestructS{staticintTestAdd(intiTest){*Addr=iTest+*Addr;return*Addr;}};intmain(){Ss;std::cout这将导致输出10。就目前而言,这对我来说是该语言的一个有趣的特性,但是,视频中的人强调这是一个有用的功能,并且已用于在传递全局变量时减少代码膨胀。但是,我不明白它是

c++ - 未在可变函数模板中推导出上下文

据我所知,下面的代码应该是“未推导上下文”(或者不是?)templatevoidf(X...args,Yy){}intmain(){f(12);f(1,2,3,4);}但是g++4.9为main中f的两个实例编译它...谁能解释一下? 最佳答案 第一个电话f(12)是病式的。根据[temp.deduct.type]/p5.7,未出现在参数声明末尾的参数包是非推导上下文:Thenon-deducedcontextsare:—[..]—Afunctionparameterpackthatdoesnotoccurattheendofthe

c++ - 我可以写一个类似于缩写函数模板的 catch 子句吗?

在我的程序的顶部,我有一个异常处理程序。它看起来像这样:try{//majorityofprogram}catch(...){Handle_All_Exceptions();}voidHandle_All_Exceptions(){try{throw;}catch(TypeAconst&e){Handle(e);}catch(TypeBconst&e){Handle(e);}catch(TypeCconst&e){Handle(e);}catch(TypeDconst&e){Handle(e);}catch(...){Handle_Unknown();}}voidHandle(Type

c++ - 是否允许不可访问的类型作为模板参数?

假设我有一个带有一些重要元数据的模板类:templatestructMetadata{staticconstintImportantInformation;};我有一个使用私有(private)内部类做一些工作的类:classWorkDoer{classPrivate;public:WorkDoer();};私有(private)内部类继承自Metadata:classWorkDoer::Private:publicMetadata{};ImportantInformation常量不是由编译器自动定义的,因此它需要位于顶级作用域的某个编译单元中,否则链接将失败:templatecons

c++ - 模板函数特化与重载

来自一些关于模板特化的幻灯片:#includeusingnamespacestd;templateX&min(X&a,X&b){returna>b?b:a;}int&min(int&a,int&b){//rewriteofthefunctioninthecaseofint:coutb?b:a;}/*newsyntax–themoreappropriateway:templateint&min(int&a,int&b){coutb?b:a;}*/为什么第二种方式更“合适”? 最佳答案 重载适用于大多数上下文,AFAIK是建议的基线方法

c++ - 如何将 __declspec(align(16)) 与模板一起使用?

我正在尝试使我的class16-byte与__declspec(align(16))对齐;但是它是一个模板类。如果我将__declspec(align(16))放在模板关键字之前,它告诉我那里不允许使用可变属性。如果我将它放在class关键字之前,整个类将变得无效并且所有方法都会显示错误。那么它是怎么做到的呢? 最佳答案 这个实现可能会回答这个请求:templatestructalignas(Align)aligned_storage{Ta;Tb;};templatestructaligned_storage_members{ali

c++ - 模板化派生类的特化函数模板

我基本上有一个std::integral_constant的模拟版本包含一个变量,我想为这些派生自Base的类专门化一个函数模板,像这样:templatestructBase{typedefTtype;Tt;};templatestructA:Base{staticconstexprTvalue=1;};templatestructB:Base{staticconstexprTvalue=2;};structUnrelated{};//etc.templatevoidfoo(Tt){//IwouldliketospecializefooforAandBandhaveaversionfo

c++ - 具有推导的 void 返回类型的 Constexpr 类模板成员函数?

考虑以下简单类X和类模板Y每个定义四个constexpr成员,其中三个推导了它们的返回类型(新的C++1y特性),另外三个成员的另一个子集使用了另一个新的C++1y特性:轻松的constexpr现在也可以有副作用的函数和一个void返回类型。下面是这些功能交互的小实验:#include#includestructX{constexprvoidfun(){}//OKconstexprautogun(){}//OKautohun(){}//OKconstexprautoiun(){return0;}//OK};templatestructY{constexprvoidfun(){}//OK