采用N个参数的C ++方法

时间:2014-07-30 11:24:58

标签: c++ eclipse vector parameters variadic-functions

说我的一个类有 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 字符串并了解何时从cicle退出。

在主要内容中,我将以这种方式调用foo:

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

2 个答案:

答案 0 :(得分:2)

你应该以某种方式传递给参数的函数计数。例如,请查看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;
}

答案 1 :(得分:2)

编写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.Preprocessor自动生成重复的参数和参数处理程序。