草庐IT

可变性

全部标签

c++ - 传递初始化列表时可变参数模板参数推导失败

Bar包含std::array的std::pair的std::vectorFooValueAdaptor的。FooValueAdaptor将int隐式转换为bool为FooValue,这在这个人为的示例中没有什么意义,但在我的应用程序。我实现了一个方便的函数Bar::addEntries用于一次添加多个条目,但是使用两个以上的参数调用它无法使用GCC4.8.0进行编译。请参阅下面的错误消息。#include#include#includeenumclassFooValue{A,B,C};classFooValueAdaptor{public:FooValueAdaptor(boolva

c++ - 可变参数 lambda 捕获的解决方法

我在这里看到了一些与在lambda中捕获可变参数的gcc错误有关的问题。参见示例:Doeslambdacapturesupportvariadictemplatearguments或Compilerbug,ornonstandardcode?-Variadictemplatecaptureinlambda.我有以下我想做的人为的例子#include#includeclassTestVariadicLambda{public:templatestd::functiongetFunc(Args...args){return[=]{printArgs(args...);};}template

c++ - 可变参数模板的声明点

什么时候可变参数模板被认为是“声明的”?这会在clang++3.4下编译,但不会在g++4.8.2下编译。templateconstT&sum(constT&v){returnv;}templateautosum(constT&v,constTs&...params)->decltype(v+sum(params...));templateautosum(constT&v,constTs&...params)->decltype(v+sum(params...)){returnv+sum(params...);}intmain(){sum(1,2,3);}显然g++不会在尾随返回类型中

c++ - 将 nullptr 传递给可变模板指针

我目前有以下功能:templatevoidGet(T*out,Args*...other);templatevoidGet(T*out);templatevoidGet(int*out);templatevoidGet(int64*out);templatevoidGet(double*out);templatevoidGet(char**out);templatevoidGet(void**out);调用使用:Get(&i,&t,&f);i为int,t为char*和f作为double。如果我想传递一个空指针,这非常有用,但有一个异常(exception)。Get(&i,nullptr

c++ - 可变参数模板扩展中的函数调用顺序

我在一个开源项目中找到的代码基本上是这样的:templatevoidexpand_calls_hack(Args&&...args){}templatestructfoo{staticvoidbar(some_tuple_type&t){meta::expand_calls_hack((std::get(t).doSomething(),0)...);}};我认为这个“构造”用于为每个元组元素调用doSomething()。然而,在我看来,对doSomething()的调用顺序是未定义的,至少在C++03中是正常函数。这将是一个错误,因为调用有副作用。我有两个问题:(tupleElem

c++ - 我想完善除特定类型之外的前向可变参数

我有以下内容#include#includetemplateclasshandle{usingptr=std::shared_ptr;usingpptr=std::shared_ptr;public:handle(handleconst&other):mData(make_pptr(*(other.mData))){}handle(_type&&data):mData(make_pptr(std::move(data))){}private:pptrmData;templateconstexprautomake_ptr(_args&&...args){returnstd::make_s

c++ - 从虚拟堆栈评估可变参数

我正在制作一个基于字节码脚本的小型堆栈引擎,以了解C++中的嵌入式脚本。目标是能够注册任何std::function由脚本调用。我现在拥有的基本上是classBytecode{private:Stackstack;//Functionstobecalledfromscript.//Whenafunctioniscalled,itsargumentsareexpectedtobeinthestack.std::vector>ops;public://RegisterC++functiontobecalledbyscripttemplatestd::size_tfunction(Funcf

c++ - 类型名和标量常量的可变参数模板

我正在尝试实现一个通用类模板,它将它的模板参数转发给另一个类,如下所示:templateclassA:publicB{...问题是B可以有这样的标量常量模板:templateclassB{...甚至像这样:templateclassB{...那么,有什么方法可以接受混合的类型名和标量常量作为可变参数模板参数吗? 最佳答案 您可以将值嵌入到类型中。如果我没记错的话,这是boost长期使用的一种技术,并作为std::integral_constant添加到C++11的标准库中(表明它的有用性)。使用C++17,事情变得更加简单。temp

c++ - 将参数传递给另一个可变参数函数

有没有什么办法可以让这段代码按预期编译和工作,而无需诉诸va_list东西?#includevoidfct(void){std::cout 最佳答案 我怀疑你误解了签名的意思voidfct(intindex,intindexes...)我怀疑您认为fct()期望一个int单值(index)和一个int的(indexex...)具有C++11风格的参数包扩展。编号:it'sthesameasvoidfct(intindex,intindexes,...)所以两个int单个值和一个C风格的可选参数,您只能通过va_list东西使用。如果

c++ - 为什么不为 GMock 1.8.0 编译带有可变参数的模拟函数

考虑这个片段MOCK_METHOD1(foo,int(volatileint*));这段代码在GMock1.7.0上编译得很好,但是当我更新到GMock1.8.0时它抛出了一个错误../gmock/fused-src/gtest/include/gtest/gtest-printers.h:467:6:error:reinterpret_castfromtype'volatileint*'totype'constvoid*'castsawayqualifiers*os(p);^很明显,它没有编译,因为根据定义,reinterpret_cast无法删除cv限定符。我还需要说明一下,我使用