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

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;
}

我知道我们通常会传递一个额外的参数,告诉接收者方法参数的总数,或者我们传递一个感伤的结束参数。但是为了保持简短和干净,我不喜欢传递额外的参数。

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

最佳答案

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

但是,在 C++0x 中,您将能够使用 std::initializer_list 来执行此操作,它是可变参数的更智能、类型更安全的替代方法。例如:

template <class T>
Polynomial<T>::Polynomial(T FirstCoefficient, std::initializer_list<T> coeffs)
{
    m_coefficients.insert(m_coefficients.begin(), coeffs.begin(), coeffs.end());
}

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

关于c++ - 可变长度参数列表 - 如何理解我们检索了最后一个参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4642014/

10-11 21:57