如何停止检查可变参数
How to stop checking for variadic arguments
我有一个 class 包含一个特定类型的向量,我想给它一个可变参数构造函数来向向量添加元素。
class MyClass
{
std::vector<int> numbers;
MyClass(int &x...)
{
va_list args;
va_start(args, x);
while(/*some condition, I'm not sure*/)
{
numbers.push_back(va_arg(args, int));
}
va_end(args);
}
};
我怎么知道什么时候停止检查参数?我的可变参数语法是否正确?我所要做的就是 cppreference.com.
上的可变函数教程
您不能使用 C 风格的变量参数列表,除非您以某种方式告诉函数它获得了多少参数。例如,您可以将 int count
作为第一个参数传递给可变参数列表,并使用此计数来确定何时停止处理参数。 printf()
等函数使用格式字符串来确定期望的参数数量(以及它们得到的类型)。
为您的 class 提供可变数量参数的最简单方法不是使用可变参数列表,而是使用 std:initializer_list<int>
:
#include <initializer_list>
#include <vector>
class MyClass {
std::vector<int> v;
public:
MyClass(std::initializer_list<int> args): v(args) {}
};
可以这样使用:
MyClass object1{ 1, 2, 3, 4 };
MyClass object2({ 1, 2, 3, 4 });
如果您打算使用可变参数模板,构造函数的表示法将如下所示:
template <typename... T>
MyClass(T&&... args): v{ std::forward<T>(args)... } {}
但是,这可能会做一些细微的不同。我建议使用 std::initializer_list<int>
.
我有一个 class 包含一个特定类型的向量,我想给它一个可变参数构造函数来向向量添加元素。
class MyClass
{
std::vector<int> numbers;
MyClass(int &x...)
{
va_list args;
va_start(args, x);
while(/*some condition, I'm not sure*/)
{
numbers.push_back(va_arg(args, int));
}
va_end(args);
}
};
我怎么知道什么时候停止检查参数?我的可变参数语法是否正确?我所要做的就是 cppreference.com.
上的可变函数教程您不能使用 C 风格的变量参数列表,除非您以某种方式告诉函数它获得了多少参数。例如,您可以将 int count
作为第一个参数传递给可变参数列表,并使用此计数来确定何时停止处理参数。 printf()
等函数使用格式字符串来确定期望的参数数量(以及它们得到的类型)。
为您的 class 提供可变数量参数的最简单方法不是使用可变参数列表,而是使用 std:initializer_list<int>
:
#include <initializer_list>
#include <vector>
class MyClass {
std::vector<int> v;
public:
MyClass(std::initializer_list<int> args): v(args) {}
};
可以这样使用:
MyClass object1{ 1, 2, 3, 4 };
MyClass object2({ 1, 2, 3, 4 });
如果您打算使用可变参数模板,构造函数的表示法将如下所示:
template <typename... T>
MyClass(T&&... args): v{ std::forward<T>(args)... } {}
但是,这可能会做一些细微的不同。我建议使用 std::initializer_list<int>
.