c – 函数中的参数数量未知
|
参见英文答案 >
Variable number of arguments in C++?????????????????????????????????????15个
我有班级成员: LineND::LineND(double a ...)
{
coefficients.push_back(a);
va_list arguments;
va_start(arguments,a);
double argValue;
do
{
argValue = va_arg(arguments,double);
coefficients.push_back(argValue);
}while(argValue != NULL); // THIS IS A PROBLEM POINT!
va_end(arguments);
}
我不知道将使用多少个参数.我需要将每个参数都放入称为系数的向量中.我该怎么办?我明白,在这种情况下,语句while(argValue!= NULL)不正确.我不能使用例如这个签名: LineND::LineND(int numArgs,double a ...) 改变这样的条件: while(argValue != numArgs); 关键是我无法改变方法的签名.需要另一种方法来解决这个问题. 解决方法
变量参数列表有几个缺点:
>来电者可以传递他们想要的一切. 与可变参数模板相比: >编译时间列表大小已知 例: void pass_me_floats_impl (std::initializer_list<float> floats) {
...
}
您可以将它放入类声明的私有部分或某些详细的命名空间中.注意:pass_me_floats_impl()不必在头文件中实现. 那么这里是您客户的好东西: template <typename ...ArgsT>
void pass_me_floats (ArgsT ...floats) {
pass_me_floats_impl ({floats...});
}
他现在可以这样做: pass_me_floats (); pass_me_floats (3.5f); pass_me_floats (1f,2f,4f); 但他做不到: pass_me_floats (4UL,std::string()); 因为那会在你的pass_me_floats函数中发出一个编译错误. 如果你至少需要2个参数,那么就这样做: template <typename ...ArgsT>
void pass_me_floats (float one,float two,ArgsT... rest) {}
当然,如果你想要一个完整的内联函数,你也可以 template <typename ...ArgsT>
void pass_me_floats (ArgsT... rest) {
std::array<float,sizeof...(ArgsT)> const floaties {rest...};
for (const auto f : floaties) {}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
