C++ 可变模板的统一初始化
我有一个PODC++ 可变模板的统一初始化,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,
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 }})