接受N个参数的c++方法

C++ method that takes N parameters

本文关键字:c++ 方法 参数 接受      更新时间:2023-10-16

说我有我的一个类与foo(…)方法,其中:

=>表示可变数目的参数

我想把所有的形参保存在std::vector中。

我试过了:

std::vector<std::string> A::foo(...) {
  std::vector<std::string> list;
  va_list args;
  va_start(args, 0); 
  for ( ; /* which condition to exit? */ ; ) {
      std::string s = va_arg(args, char*);
      list.push_back(s);
  }
  return list;
}

显然这不能工作,但我不知道如何填充s字符串并理解何时退出循环。

在main中我将这样调用foo:

foo("param0", "param1", "param2", ... , "paramN")

您应该以某种方式传递给函数的参数计数。例如,看看int printf ( const char * format, ... );。该函数解析格式字符串并确定提供了多少参数。你可以这样修改你的代码:

std::vector<std::string> A::foo(size_t count, ...) {
  std::vector<std::string> list;
  va_list args;
  va_start(args, 0); 
  for ( size_t i = 0; i < count; ++i ) {
      std::string s = va_arg(args, char*);
      list.push_back(s);
  }
  return list;
}

A::foo的正确方法是把它写成c++ 11可变模板:

template<typename... Args>
std::vector<std::string> A::foo(Args&& ...args) {
    return {std::forward<Args>(args)...};
}

如果没有这个选项,您可以使用默认参数接受最多固定数量的参数:

std::vector<std::string> A::foo(
    const char* arg1 = 0,
    const char* arg2 = 0,
    // ...
    const char* arg10 = 0)
{
    std::vector<std::string> ret;
    if (arg1) ret.push_back(arg1); else return ret;
    if (arg2) ret.push_back(arg2); else return ret;
    // ...
    if (arg10) ret.push_back(arg10); else return ret;
    return ret;
}

您可以使用预处理库,例如Boost。预处理器,用于自动生成重复参数和参数处理程序。