如何更改此函数以支持多个参数? #包括 使用名称空间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