如何从一个函数传递可变数量的参数到另一个函数?

4
有没有办法直接从一个函数传递可变数量的参数到另一个函数中?
我想实现以下最简解决方案:
int func1(string param1, ...){
  int status = STATUS_1;
  func2(status, param1, ...);
}

我知道可以使用类似以下代码的方式来实现,但是这段代码将会被多次复制,因此我希望保持尽可能简洁的同时也使函数调用非常短

int func1(string param1, ...){
  int status = STATUS_1;
  va_list args;
  va_start(args, param1);
  func2(status, param1, args);
  va_end(args);
}

谢谢!


你的意思是传递变量的值而不是变量本身吗? - Umair A.
1
C++ 并没有为 C 风格的可变参数添加任何东西。您会考虑使用 C++0x 吗? - Potatoswatter
2
你不传递参数,而是传递实参。有关这些术语之间的区别,请参阅C++标准。 - Chubsdad
你可以通过直接将STATUS_1传递给函数来减少一行代码。此外,如果不是错误的话,在func2()前面的int有点奇怪。 - Jonathan Leffler
3个回答

7
不,你必须像第二个例子一样使用va_list来传递可变参数。如果要避免重复这些行并且func2始终相同,或者至少采用相同的参数,请将其制作为宏,只需要额外三行代码。
#define CALL_MY_VA_FUNC(func,param) do {\
        va_list args; \
        va_start(args,param);\
        func(param,param,args);\
        va_end(args); } while(0)

我现在正在使用宏,但我希望有更好的方法。谢谢。 - Zain Rizvi
@Zain:你遇到了什么问题,需要更好的解决方案吗?还是只是对恶意宏和标识符冲突的一般担忧? - Tony Delroy

3
只需将参数作为va_list类型的参数传递给func2函数。

0
也许你可以尝试将参数封装在一个结构体中。
struct Params
{
   int status;
   std::string param1;
};

void func1(Params& params)
{
   int status = params.status;
   func2(params);
}

void func2(Params& params)
{
   std::string param1 = params.param1;
}

在重构过程中,当参数列表经常变化时,我有时会使用这个技巧。

不过,从你的问题中我不确定这是否能解决你的问题。

--

有趣的是,同样的方法也可以用于模板,通过在结构体中定义typedefs等来代替普通成员变量(我通常在代码中使用类而不是结构体,因为在C++中结构体和类基本上没有区别)。这可以解决在重构或开发期间需要维护大量会频繁更改的模板代码的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接