加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 函数中的参数数量未知

发布时间:2020-12-16 10:46:24 所属栏目:百科 来源:网络整理
导读:参见英文答案 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
参见英文答案 > 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);

关键是我无法改变方法的签名.需要另一种方法来解决这个问题.

解决方法

变量参数列表有几个缺点:

>来电者可以传递他们想要的一切.
>如果传递了非POD对象,则会召唤未定义的行为
>你不能依赖参数的数量(调用者可以犯错误)
>您对您的CLIENT负有很多责任,对您而言,您希望更轻松地使用库代码(实际示例:format-string-bugs / -errors)

与可变参数模板相比:

>编译时间列表大小已知
>类型在编译时已知
>你有责任,而不是你的客户,这是应该的.

例:

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) {}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读