说我的一个类有 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")
答案 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自动生成重复的参数和参数处理程序。