C++ 可变长度参数列表-如何理解我们检索到的最后一个参数?

C++ 可变长度参数列表-如何理解我们检索到的最后一个参数?,c++,variadic-functions,C++,Variadic Functions,我有一个多项式类,它保存给定多项式的系数。 它的一个重载构造函数应该通过变量参数列表接收这些系数 template <class T> Polynomial<T>::Polynomial(T FirstCoefficient, ...) { va_list ArgumentPointer; va_start(ArgumentPointer, FirstCoefficient); T NextCoefficient = FirstCoefficien

我有一个
多项式
类,它保存给定多项式的系数。
它的一个重载构造函数应该通过变量参数列表接收这些系数

template <class T>
Polynomial<T>::Polynomial(T FirstCoefficient, ...)
{
    va_list ArgumentPointer;
    va_start(ArgumentPointer, FirstCoefficient);
    T NextCoefficient = FirstCoefficient;
    std::vector<T> Coefficients;
    while (true)
    {
        Coefficients.push_back(NextCoefficient);
        NextCoefficient = va_arg(ArgumentPointer, T);
        if (/* did we retrieve all the arguments */) // How do I implement this?
        {
            break;
        }
    }
    m_Coefficients = Coefficients;
}
模板
多项式::多项式(T系数,…)
{
va_列表参数指针;
va_开始(参数指针,第一个系数);
T nextcoffice=第一系数;
std::向量系数;
while(true)
{
系数。推回(下一个效率);
nextcoffice=va_arg(ArgumentPointer,T);
如果(//*我们检索到所有参数了吗*/)//我如何实现这一点?
{
打破
}
}
m_系数=系数;
}
我知道我们通常传递一个额外的参数,告诉接收者方法参数的总数,或者传递一个感伤的结束参数。但为了保持简洁,我不喜欢传递额外的参数


有没有办法在不修改示例中的方法签名的情况下执行此操作?

一般来说,没有,没有办法知道何时达到最后一个参数,并且需要提供某种类型的哨兵。由于这个原因,变长参数列表本质上是不安全的;无法静态检查所有参数是否已正确接收,或者它们是否具有正确的类型,等等。如果您查看大多数varargs函数,它们都可以通过某种方式知道有多少个参数
printf
scanf
使用格式化字符串,
open
查看操作类型等

但是,在C++0x中,您可以使用
std::initializer\u list
来实现这一点,这是一种比varargs更智能、类型更安全的替代方法。例如:

template <class T>
Polynomial<T>::Polynomial(T FirstCoefficient, std::initializer_list<T> coeffs)
{
    m_coefficients.insert(m_coefficients.begin(), coeffs.begin(), coeffs.end());
}
模板
多项式::多项式(T第一系数,std::初始值设定项\u列表系数)
{
插入(m_系数.begin(),coefs.begin(),coefs.end());
}

编译器现在可以检查所有参数的类型是否为
T
,并将为您执行所有范围检查。

否,这适用于所有数据结构(参数列表只是另一个数据结构)。您有3.5个选项:

  • 静态、预定义的长度
  • 哨兵值
  • 数据结构包括其长度。
    3.5. 数据结构本身提供了一些方法,可以在到达数据结构的末尾之前安全地导出长度

  • 不管怎样,您的解决方案将归结为以下选项之一。

    您忘记了选项4:SEGFULT!