Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板的统一初始化_C++_C++11_Variadic Templates_Uniform Initialization - Fatal编程技术网

C++ 可变模板的统一初始化

C++ 可变模板的统一初始化,c++,c++11,variadic-templates,uniform-initialization,C++,C++11,Variadic Templates,Uniform Initialization,我有一个PODChParam,它是可变模板函数set中的一个参数。我想用大括号p.set({Param::d,1000.f},{Param::p,2000.f})传递函数参数(构造函数参数)。并且认为构造函数将被隐式调用,并且将创建ChParam对象。但这是不可能的,我应该显式地创建一个对象a.set(ChParam{Param::D,1000.f},ChParam{Param::p,2000.f}) 是否可以以某种方式使用变量p.set({Param::D,1000.f},{Param::p,

我有一个POD
ChParam
,它是可变模板函数
set
中的一个参数。我想用大括号
p.set({Param::d,1000.f},{Param::p,2000.f})传递函数参数(构造函数参数)
。并且认为构造函数将被隐式调用,并且将创建
ChParam
对象。但这是不可能的,我应该显式地创建一个对象
a.set(ChParam{Param::D,1000.f},ChParam{Param::p,2000.f})

是否可以以某种方式使用变量
p.set({Param::D,1000.f},{Param::p,2000.f})

#包括
使用名称空间std;
使用Float=Float;
枚举类参数:大小\u t
{
D=0,
P
};
结构ChParam
{
参数标签;
浮点数;
};
类管道图
{
私人:
浮点数D_uu,p_uu;
公众:
PipeCalcParams():D_u0,p_0{}
PipeCalcParams&set_D(Float D){D_=D;返回*this;}
PipeCalcParams&set_p(Float p){p_=p;返回*this;}
模板
管道参数和集合(常量参数和参数、参数和参数){
set(p);
返回集(args…);
}
管道参数和设置(常数参数和p)
{
开关(p.标签)
{
案例参数::D:
设置D(p.值);
打破
case参数::p:
设置p(p值);
打破
}
归还*这个;
}
};
int main(){
哌卡帕;
a、 set(ChParam{Param::D,1000.f},ChParam{Param::p,2000.f});//确定
哌卡普;
p、 set({Param::D,1000.f},{Param::p,2000.f});//错误:调用'PipeCalcParams::set(,)'p.set({Param::D,1000.f},{Param::p,2000.f})没有匹配的函数;
返回0;
}

不能直接使用

{ Param::D, 1000.f }
当需要推导时,作为函数参数。原因是括号内的初始值设定项列表没有类型。由于它没有类型,因此编译器无法推断类型。你必须帮助它前进。您可以执行所做的操作并指定类型,如

ChParam{ Param:D, 1000.f }
也可以指定所需对象的类型。如果您想要一个相同类型的变量,那么a将起作用。它允许编译器从单个带括号的初始值设定项列表中构造元素。使用它,您的代码看起来像

PipeCalcParams& set(std::initializer_list<ChParam> args)

请注意使用的额外一组花括号。最外层的集合声明了
std::initializer_列表
,每个内部集合声明了列表中的每个
ChParam

为什么不使用a?可能值得注意的是,由于这是一个类型推断问题,OP只需要指定
Args的类型
,因此
p.set({Param::D,1000.f},ChParam{Param::p,2000.f})
将起作用。@SingerOfTheFall我本来希望OP尽可能接近
p.set({Param::D,1000.f},{Param::p,2000.f})
。@SingerOfTheFall,谢谢你提供的信息,我不知道它。=)在本例中,它会起作用,但在生产代码中,在另一个可变模板函数中调用了set
,该函数是
templateFoo(Args…Args){p.set(std::forward(Args)…}
。在这种情况下,它不会编译。
PipeCalcParams& set(std::initializer_list<ChParam> args)
p.set({{ Param::D, 1000.f }, { Param::p, 2000.f }})