Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何停止检查可变参数_C++_Variadic Functions - Fatal编程技术网

C++ 如何停止检查可变参数

C++ 如何停止检查可变参数,c++,variadic-functions,C++,Variadic Functions,我有一个类,它包含一个特定类型的向量,我想给它一个变量构造函数,向向量中添加元素 class MyClass { std::vector<int> numbers; MyClass(int &x...) { va_list args; va_start(args, x); while(/*some condition, I'm not sure*/) { numbe

我有一个类,它包含一个特定类型的向量,我想给它一个变量构造函数,向向量中添加元素

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);
    }
};
class-MyClass
{
std::向量数;
MyClass(int&x…)
{
va_列表参数;
va_启动(args,x);
虽然(/*某些条件,我不确定*/)
{
数字。推回(va_arg(args,int));
}
va_端(args);
}
};

我如何知道何时停止检查参数?我的变量语法正确吗?我所要做的就是在cppreference.com上学习变量函数教程。

除非你告诉函数它有多少个参数,否则你不能使用C风格的变量参数列表。例如,可以将
int count
作为第一个参数传递给变量参数列表,并使用此计数确定何时停止处理参数。类似于
printf()
的函数使用格式字符串来确定期望的参数数量(以及它们的类型)

为类提供可变数量参数的最简单方法不是使用可变参数列表,而是使用
std:initializer\u list

如果要使用可变模板,则构造函数的符号如下:

MyClass object1{ 1, 2, 3, 4 };
MyClass object2({ 1, 2, 3, 4 });
template <typename... T>
MyClass(T&&... args): v{ std::forward<T>(args)... } {}
模板
MyClass(T&…args):v{std::forward(args)…}{

然而,这可能会带来微妙的不同。我建议使用
std::initializer\u list

除非告诉函数它得到了多少个参数,否则不能使用C风格的变量参数列表。例如,可以将
int count
作为第一个参数传递给变量参数列表,并使用此计数确定何时停止处理参数。类似于
printf()
的函数使用格式字符串来确定期望的参数数量(以及它们的类型)

为类提供可变数量参数的最简单方法不是使用可变参数列表,而是使用
std:initializer\u list

如果要使用可变模板,则构造函数的符号如下:

MyClass object1{ 1, 2, 3, 4 };
MyClass object2({ 1, 2, 3, 4 });
template <typename... T>
MyClass(T&&... args): v{ std::forward<T>(args)... } {}
模板
MyClass(T&…args):v{std::forward(args)…}{

然而,这可能会带来微妙的不同。我建议使用
std::initializer\u列表

简单的回答:你不知道。这就是为什么你必须有一个确定最后一项的方案。通过一个sentinel值,另一个告诉您参数数量的参数,或者使用
printf
使用的技术,即格式字符串描述要查找的参数。@KaiSchmidt:将
MyClass(参数的int num\u,int&…)
更改为
MyClass(参数的int num\u,…)
来执行类似操作。你可以在<代码> NUMYOFFY ARG< < /C>迭代中调用<代码> VAYARG(int)<代码>。有点偏离主题,但是在C++中,你也可以使用可变模板代替C椭圆来实现这个目标(在这种情况下,语法有点不同,它看起来也有点像你的int和…)。,如果你看到可变模板和C椭圆,然后把它们都混淆了,我不会感到惊讶。)@KaiSchmidt:是的。调用
va_start()
时,必须指定紧跟在
前面的最后一个命名参数。这是
va_arg()
开始从中读取数据的起点。@caninoos:在C++11中,您可以编写构造函数来接受一个带括号的init列表,这样就可以使用带括号的init列表初始化对象,即:
MyClass cls{1,2,3}简单回答:你不知道。这就是为什么你必须有一个确定最后一项的方案。通过一个sentinel值,另一个告诉您参数数量的参数,或者使用
printf
使用的技术,即格式字符串描述要查找的参数。@KaiSchmidt:将
MyClass(参数的int num\u,int&…)
更改为
MyClass(参数的int num\u,…)
来执行类似操作。你可以在<代码> NUMYOFFY ARG< < /C>迭代中调用<代码> VAYARG(int)<代码>。有点偏离主题,但是在C++中,你也可以使用可变模板代替C椭圆来实现这个目标(在这种情况下,语法有点不同,它看起来也有点像你的int和…)。,如果你看到可变模板和C椭圆,然后把它们都混淆了,我不会感到惊讶。)@KaiSchmidt:是的。调用
va_start()
时,必须指定紧跟在
前面的最后一个命名参数。这是
va_arg()
开始从中读取数据的起点。@caninoos:在C++11中,您可以编写构造函数来接受一个带括号的init列表,这样就可以使用带括号的init列表初始化对象,即:
MyClass cls{1,2,3}