如何更改此函数以支持多个参数? #包括 使用名称空间std; 类别样本类别 { 公众: int测试(int…参数) { 试试这样的东西 #include <iostream> using namespace std; class SampleClass { public: int test(int ... arguments) { cout << arguments[0] << endl; // Access first element in array return sizeof(arguments); } }; int main() { SampleClass lol; cout << lol.test(3, 1, 4, 2, 5, 0) << endl; return 0; } 双重测试(int num,…) { va_list arguments;//存储参数列表的位置 双和=0; va_start(arguments,num);//初始化参数以存储num之后的所有值 for(int x=0;x >你试图混合C++的两个特性,变量模板< /> >和可变长度参数列表< /C>。 您的代码根本不会编译,因为您在这里没有模板,而对于可变长度参数列表声明应该是 double test( int num, ... ) { va_list arguments; // A place to store the list of arguments double sum = 0; va_start ( arguments, num ); // Initializing arguments to store all values after num for ( int x = 0; x < num; x++ ) // Loop until all numbers are added sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum. va_end ( arguments ); // Cleans up the list return sum / num; // Returns the average }
因此,您的点位于参数列表的错误一侧。如何更改此函数以支持多个参数? #包括 使用名称空间std; 类别样本类别 { 公众: int测试(int…参数) { 试试这样的东西 #include <iostream> using namespace std; class SampleClass { public: int test(int ... arguments) { cout << arguments[0] << endl; // Access first element in array return sizeof(arguments); } }; int main() { SampleClass lol; cout << lol.test(3, 1, 4, 2, 5, 0) << endl; return 0; } 双重测试(int num,…) { va_list arguments;//存储参数列表的位置 双和=0; va_start(arguments,num);//初始化参数以存储num之后的所有值 for(int x=0;x >你试图混合C++的两个特性,变量模板< /> >和可变长度参数列表< /C>。 您的代码根本不会编译,因为您在这里没有模板,而对于可变长度参数列表声明应该是 double test( int num, ... ) { va_list arguments; // A place to store the list of arguments double sum = 0; va_start ( arguments, num ); // Initializing arguments to store all values after num for ( int x = 0; x < num; x++ ) // Loop until all numbers are added sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum. va_end ( arguments ); // Cleans up the list return sum / num; // Returns the average },c++,c++11,C++,C++11,因此,您的点位于参数列表的错误一侧。 我希望这对你有帮助,祝你好运。试试这样的东西 #include <iostream> using namespace std; class SampleClass { public: int test(int ... arguments) { cout << arguments[0] << endl; // Access first element in array
我希望这对你有帮助,祝你好运。试试这样的东西
#include <iostream>
using namespace std;
class SampleClass
{
public:
int test(int ... arguments)
{
cout << arguments[0] << endl; // Access first element in array
return sizeof(arguments);
}
};
int main()
{
SampleClass lol;
cout << lol.test(3, 1, 4, 2, 5, 0) << endl;
return 0;
}
双重测试(int num,…)
{
va_list arguments;//存储参数列表的位置
双和=0;
va_start(arguments,num);//初始化参数以存储num之后的所有值
for(int x=0;x
因此,您的点位于参数列表的错误一侧。
我希望这有助于GooGr.y/P>< P> >你试图混合C++的两个特性,<代码>变量模板< /> >和<代码>可变长度参数列表< /C>。 您的代码根本不会编译,因为您在这里没有模板,而对于
可变长度参数列表
声明应该是
double test( int num, ... )
{
va_list arguments; // A place to store the list of arguments
double sum = 0;
va_start ( arguments, num ); // Initializing arguments to store all values after num
for ( int x = 0; x < num; x++ ) // Loop until all numbers are added
sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum.
va_end ( arguments ); // Cleans up the list
return sum / num; // Returns the average
}
您可以使用cstdarg
标题中的函数访问此列表中的值
使用可变模板
可以执行以下操作
int test(int arguments...)
派生类
{
公众:
样板
int测试()
{
int数组[]={arguments…};
返回sizeof(数组)/sizeof(*数组);
}
};
像这样使用它
class Derived
{
public:
template<int... arguments>
int test()
{
int array[] = {arguments...};
return sizeof(array) / sizeof(*array);
}
};
<代码> CUT> P> HM。你试图混合C++的两个特性,<代码>变量模板< /C>和<代码>可变长度参数列表< /C>。 您的代码根本不会编译,因为您在这里没有模板,而对于
可变长度参数列表
声明应该是
double test( int num, ... )
{
va_list arguments; // A place to store the list of arguments
double sum = 0;
va_start ( arguments, num ); // Initializing arguments to store all values after num
for ( int x = 0; x < num; x++ ) // Loop until all numbers are added
sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum.
va_end ( arguments ); // Cleans up the list
return sum / num; // Returns the average
}
您可以使用cstdarg
标题中的函数访问此列表中的值
使用可变模板
可以执行以下操作
int test(int arguments...)
派生类
{
公众:
样板
int测试()
{
int数组[]={arguments…};
返回sizeof(数组)/sizeof(*数组);
}
};
像这样使用它
class Derived
{
public:
template<int... arguments>
int test()
{
int array[] = {arguments...};
return sizeof(array) / sizeof(*array);
}
};
cout你有几个选择
1) 使用椭圆(具有无限参数列表的唯一方法):
您的代码将需要像printf一样解析椭圆。您将被限制为内置C类型
2) 使用多个模板:
int foo(int a1, ...);
你有几个选择
1) 使用椭圆(具有无限参数列表的唯一方法):
您的代码将需要像printf一样解析椭圆。您将被限制为内置C类型
2) 使用多个模板:
int foo(int a1, ...);
我不太确定我是否完全理解你的问题。如果你想访问函数的“第一个”参数而不是模板,我想这样做对你来说可以,但我可能完全误解了你的目的:
int foo(int a1, int a2 = -1, int a3 = -1, int aN = -1);
我不太确定我是否完全理解你的问题。如果你想访问函数的“第一个”参数而不是模板,我想这样做对你来说可以,但我可能完全误解了你的目的:
int foo(int a1, int a2 = -1, int a3 = -1, int aN = -1);
既然我们都在猜测你想要什么,我就插一句:
[1]
[2]
[3]
[4]
[5]
5
[100]
[200]
[300]
3
[10]
[20]
2
垃圾被评估其副作用并丢弃,整个东西被推断为一个std::initializer\u list
,就像我们写的一样
auto unused = { 0, ((cout << '[' << arg0 << "]\n"), 0),
((cout << '[' << arg1 << "]\n"), 0),
((cout << '[' << arg2 << "]\n"), 0) };
(如果有人在没有参数的情况下调用函数,那么在开始处会有额外的零,以避免语法错误。)
(void)unused;
行正在将unused
转换为void
。它将编译为完全无效,但通常也会告诉编译器不要警告我们unused
是一个未使用的变量。既然我们都在猜测您想要什么,我将加入:
[1]
[2]
[3]
[4]
[5]
5
[100]
[200]
[300]
3
[10]
[20]
2
垃圾被评估其副作用并丢弃,整个东西被推断为一个std::initializer\u list
,就像我们写的一样
auto unused = { 0, ((cout << '[' << arg0 << "]\n"), 0),
((cout << '[' << arg1 << "]\n"), 0),
((cout << '[' << arg2 << "]\n"), 0) };
(如果有人在没有参数的情况下调用函数,那么在开始处会有额外的零,以避免语法错误。)
(无效)unused;
行正在将unused
强制转换为void
。它将编译为完全无效,但通常也会告诉编译器不要警告我们unused
是一个未使用的变量。@永远基本上,创建一个参数列表并能够访问它们。您不能将列表或向量传递给func???@Nik。是的,b但我试图避免纯粹出于教育目的。类派生的与你问题的根源无关,这是一个公平的评估吗?@WhozCraig绝对!我在测试一些其他东西,忘了重命名类。事实上,我已经更新了问题以删除它。好眼睛!@ForEveR基本上,做一个argument列表并能够访问它们。你不能将列表或向量传递给func吗???@Nik。是的,但我正试图避免纯粹出于教育目的。类派生与你问题的根源无关,这是一个公平的评估吗?@WhozCraig绝对正确!我在测试一些其他东西,忘了重命名类。事实上,我已经更新了这个问题来删除它。眼睛好!太好了!非常感谢。有什么特别的理由不使用返回sizeof…(参数);
@Who