草庐IT

c++ - GCC:函数包装器模板问题

我在GCC5.3上尝试让一些函数包装器代码工作,这在clang上运行良好。这是一个简化的例子:#includeusingnamespacestd;templatestructFunctionWrapper;templatestructFunctionWrapper{};staticinttestFunc(int_a,int_b){return_a+_b;}intmain(){FunctionWrapperwrapper;return0;}我在gcc上得到的错误如下:prog.cpp:9:46:error:'Ret(Args...)'isnotavalidtypeforatemplate

c++ - 在预编译头文件中实例化模板会减少编译时间吗?

例子:假设我在我的预编译头文件中包含:#include由于vector的一些实例,例如std::vector、std::vector等在我的项目中经常使用,如果我像这样在预编译头文件中实例化它们是否会减少编译时间:#includetemplateclassstd::vector;templateclassstd::vector;更进一步,将虚拟函数添加到使用一些函数的预编译头是否有意义:namespacepch_detail{inlineautofunc(){auto&&v=std::vector{};v.size();v.begin();v.front();}}我非常不确定翻译单元和

c++ - 可变递归模板

我有一种特殊的格式,需要以空格分隔的标记和最后的空终止符(空是输出的一部分)。我创建了一个函数来将一系列以空格分隔的标记发送到输出流://C++variadictemplatefunctiontooutputtokenstoastreamdelimitedbyspacestemplatevoidjoin(std::ostream&os,Tconst&arg){//Thisisthelastargument,soinsertanullinthestreamtodelimitosvoidjoin(std::ostream&os,Tconst&arg,Args...args)//recurs

c++ - 具有不同模板参数的函数返回类型

我有一些C++类都具有相同的模板参数templatestructA{};templatestructB:A{};templatestructC:A{};等等。我还有一系列方法可以用于这些类中的任何一个。但是,问题出在返回类型上。我希望此方法返回传入类的实例,整数减一。例如,如果我只是重载函数,它看起来像这样templateAfunc(constA&a){}templateBfunc(constB&a){}templateCfunc(constC&a){}有没有一种方法可以在不重载每种类型的函数的情况下实现这一点?我的意思是......是否可以用单个模板函数替换它们?所有功能的逻辑都是相

c++ - 模板非类型参数推导

是否可以为c++17函数推导模板值(而非类型)?函数foo:templateintfoo(){return(I);}可以通过以下方式调用:foo();并将返回5。模板类型可以通过函数参数的类型推导出来。是否有可能以某种方式对模板值做同样的事情?例如:templateintbar(constintx){return(I);}这显然行不通(因为对于一个x来说,在它的声明之前是必需的),但是可能有一些C++17技巧允许这样做吗?我想用它来设置常量表达式函数参数。 最佳答案 你想要的只能通过(ab)使用整数推导的类型推导来完成。观察:tem

c++ - 具有基于参数类列表的使用 constexpr 的字段的 Variadic CRTP 模板类

我已经(在c++11中)编写了一个可变参数模板constexpr函数,它计算参数类型的最大sizeof,例如:maxSizeof()它工作正常。然后我想要一个带有字段的可变参数模板类,该字段是一个大小等于maxSizeof()的数组。这也应该可以正常工作:templateclassMyclass{uint8_tfield[maxSizeOf()]}但我还需要Myclass来为每个参数类型声明方法。我通过以下方式使用CRTP:templateclassMyclass;templateclassMyclass{uint8_tfield[maxSizeOf()]//(1)Couldn'tdo

c++ - 是否可以使 lambda 签名中的模板变量通用?

假设您有一个接受std::vector的函数任何类型并以某种方式处理它:templatevoidfoo(std::vector&vec){//workwithvec}自C++14,我们可以用lambdas达到同样的目的。在这种情况下,我们称它们为genericlambdas,因为我们向它们引入了类似模板的推导:autofoo_lambda=[](std::vector&vec){//workwithvec};但对我来说,我们的选择似乎非常有限。假设我不仅要引入类型推导,还需要引入模板值。例如,让我们更改std::vector至std::array:templatevoidfoo(std

C++ 模板预处理器工具

是否有编译器或独立预处理器可以获取C++文件并运行模板扩展过程,从而生成带有扩展模板实例化的新C++代码?我记得在20世纪90年代中期有这样一个工具,当时模板仍然是新的和实验性的,预处理器是一种在没有native模板支持的情况下使用编译器进行模板编程的方法。这比宏处理步骤复杂得多,因为它可能需要解析和标记代码以理解上下文。我希望在编写OpenCL代码时使用这样的工具。OpenCL是C++,但不支持模板。我希望我可以编写模板,即使是简单的模板,比如只有整数或bool参数,并有一些工具预解析文件并通过并找到模板的使用并扩展调用并给我新的C++代码OpenCL编译器可以理解。即使是一个非常有

使用模板与内联的 C++ 元编程

是否值得编写如下代码来复制数组元素:#includeusingnamespacestd;templatestructRepeat{staticvoidcopy(int*x,int*y){x[START+N-1]=y[START+N-1];Repeat::copy(x,y);}};templatestructRepeat{staticvoidcopy(int*x,int*y){x[START]=y[START];}};intmain(){inta[10];intb[10];//initializefor(inti=0;i::copy(a,b);//showfor(inti=0;i还是使用

c++ - Bjarne 会犯错吗? (在解释模板时),还是我还是不明白?

伙计们,我正在做“C++编程语言第3版”中的练习。在第340页上有一个函数示例:template>//Hereisadefaultargument//ButasfarasI'mconcernedit'sillegaltohaveadefaultargumentin//afunctiontemplateintcompare(constString&str1,constString&str2){/*Somecode*/}所以我的问题是:是书有误还是我理解错了? 最佳答案 是的,这本书在这种情况下是错误的。在函数模板声明中使用默认模板参数