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) {} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |