草庐IT

可变性

全部标签

c++ - 是否可以在 lambda 中捕获可变数量的参数?

考虑以下一组示例。函数takeOnlyVoidFunction接受一个零参数的函数并简单地执行它。takeVariableArguments函数接受可变数量的参数并使用这些参数执行函数。函数captureVariableArgs试图将第二个函数转换为第一个函数可接受的lambda形式,但它没有编译。如何使函数captureVariableArgs编译并展示将具有可变数量参数的函数转换为不带参数的闭包的正确行为?#include#includevoidtakeOnlyVoidFunction(std::functiontask){task();}templatevoidtakeVaria

c++ - 包含可变参数包的第一个可转换类型的别名的结构

这个问题在这里已经有了答案:findingtype,forwhichis_constructibleholds(4个答案)关闭5年前。我有typenameT1并且我有一个参数包typename...Variadic。我想创建一个结构,其中包含一个使用别名usingType=...到参数包中的第一个类型,T1可以转换成。到目前为止,我已经尝试了以下方法:templatestructVariadicConvertibleType{usingType=std::enable_if::value,T2>::type;};对于前两种类型,这可能是使用SFINAE的潜在解决方案,但我需要使用递归将

c++ - 使用可变模板中的参数定义多个方法

我想以某种方式定义一个基模板类,以便它采用可变模板参数并为每个参数定义一个虚拟方法,其中参数是参数类型。例如Base应该给我3个虚拟方法:Foo(int),Foo(bool),和Foo(string).我尝试了以下方法:templatestructBaseSingle{virtualvoidFoo(Param){};};templatestructBase:publicBaseSingle...{};不幸的是,Foo变得模棱两可。我无法获得usingBaseSingle::Foo...工作的语法。有办法吗?我知道,或者,我可以递归地继承BaseSingle并传入剩余的参数。这对性能有影

c++ - 完美转发可变模板参数

我为通用信号/槽系统编写了以下实现:templateclassSignal:NonCopyable{public:typedefstd::functionDelegate;voidconnect(constDelegate&delegate);voidoperator()(Args&&...args)const;private:std::list_delegates;};templatevoidSignal::connect(constDelegate&delegate){_delegates.push_front(delegate);}templatevoidSignal::oper

c++ - 将按引用传递和按值传递混合到可变参数模板函数是否有效?

我有一个方法,它为一个对象分配内存,然后调用它的构造函数——一个内存分配器。templateinlineT*AllocateObject(Arguments...args){returnnew(InternalAllocate(sizeof(T)))T(args...);}使用此函数混合按值传递和按引用传递是否有效?例如,使用具有一些按值和一些按引用的构造函数分配一个类。它可以编译,但我不确定它是否有任何讨厌的副作用。 最佳答案 您正在寻找的是完美转发,即。就复制副作用而言,您的AllocateObject函数应该是完全透明的。这涉

c++ - 如何在编译时交换可变参数模板的两个参数?

我试图在编译时交换可变参数模板的两个参数:templatestructsequence{};templatestructSwap_Pair{conststaticsize_tFirst=first;conststaticsize_tSecond=second;};templatestructSwap_Data{staticstd::arraydata_;//HowtoswapNumbersbaseonthepairandstoreitindata_?};用例应该是:sequencearray;autoresult=Swap_Data>::data_;//resultisnowstd::

c++ - 别名可变参数模板函数

我有一个可变参数函数,例如:voidtest(int){}templatevoidtest(int&sum,Tv,Args...args){sum+=v;test(sum,args...);}我想给它起别名:autosum=test;//error:cannotdeduceautofromtestintmain(){intres=0;test(res,4,7);std::cout我尝试使用std::bind但它不适用于可变参数函数,因为它需要占位符...是否可以为可变函数设置别名? 最佳答案 在C++1y中:#includevoid

c++ - 如何反省可变参数模板模板参数的多样性?

考虑一个假设的元函数arity,它将任何元函数作为参数并返回其实际元数。以下明显的方法是不可能的,因为根据语言标准命名的内部模板模板参数仅在本地定义。templateclassf>structarity{staticconstexprstd::size_tvalue=sizeof...(args);//ERROR:undefined'args'};即使是详尽的特化也不是一个替代方案,因为采用另一个模板类型的模板类型可能不会就内部模板的参数数量进行部分特化。这让我想到了这个问题,我担心这个问题的答案是否定的。Isthereanyreasonablewaytointrospecttheac

c++ - 是否可以从可变参数模板类型参数调用静态方法?

假设我们有类:classA{public:staticvoidm(){}}classB{public:staticvoidm(){}}templateclassC{public:voidc(){T::m();//Callsomehowm()ofAandB,ifTisaparameterpackofAandB}}如何扩展参数包并为每种类型调用静态方法? 最佳答案 问题是我们不能只扩展参数包并在函数体内直接调用它,因为它不是有效的上下文。voidc(){T::m()...;//invalidcontextforparameterpack

c++ - 编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的

下面的代码演示了我无法解释的gcc4.6.2行为。第一个函数声明一个vec_t类型的静态数组,其中vec_t是unsignedchar的typedef别名。第二个函数是相同的,除了vect_t的类型是一个模板参数。第二个函数无法编译并出现诊断“错误:‘bitVec’的存储大小不是常量”。#includevoidbitvec_func(){conststd::size_tnbits=1e7;typedefunsignedcharvec_t;conststd::size_tWLEN=std::numeric_limits::digits;conststd::size_tVSIZ=nbits