我有一个 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;
}
我知道我们通常会传递一个额外的参数,告诉接收者方法参数的总数,或者我们传递一个感伤的结束参数。但是为了保持简短和干净,我不喜欢传递额外的参数。
有没有办法在不修改示例中的方法签名的情况下执行此操作?
最佳答案
一般来说,不,没有办法知道你什么时候击中了最后一个参数,你需要提供某种哨兵。由于这个原因,可变长度参数列表本质上是不安全的;没有办法静态检查所有参数是否已正确接收,或者它们是否具有正确的类型等。如果您查看大多数可变参数函数,它们都有某种方式知道有多少参数。 printf
和 scanf
使用格式化字符串,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/