C++ 如何在不使用模板的情况下使用带字符串的变量函数?
我有以下模板功能:C++ 如何在不使用模板的情况下使用带字符串的变量函数?,c++,variadic-functions,C++,Variadic Functions,我有以下模板功能: struct ms { template <typename... Args> void update(string& query, Args&... args); }; template <typename... Args> void ms::update(string& query, Args&... args) { const int size = sizeof...(args);
struct ms {
template <typename... Args>
void update(string& query, Args&... args);
};
template <typename... Args>
void ms::update(string& query, Args&... args)
{
const int size = sizeof...(args);
vector<string> vec = { args... };
for (int i = 0; i < size; ++i) {
cout << query << ": " << vec[i] << endl;
}
}
如果存在args参数,我将如何迭代这些参数?这是一个
数组视图
:
你这样称呼它:
ms{}.update( "Hello", {"one", "two", "three"} );
作为一个更糟糕的例子,简单地以一个
std::vector
为例
在呼叫点
ms{}.update( "Hello", {"one", "two", "three"} );
同样有效。与我的解决方案不同,这会导致内存分配。为什么不直接传递一个字符串容器,例如
std::vector
?直接获取vector
?模板版本实际上有什么问题?嗯,你可以使用省略号和va_-args
之类的东西,但我不建议这样做。你可以使用初始化器列表void update(std::initializer\u-list-args)
不,不要使用va_-arg。使用向量,使用初始值设定项列表,使用模板,但不要使用va_arg。这是一堆不安全的车库。
struct ms {
void update(string const& query, array_view<string const> args);
};
void ms::update(string const& query, array_view<string const> args)
{
for (int i = 0; i < args.size(); ++i) {
cout << query << ": " << args[i] << endl;
}
}
ms{}.update( "Hello", {"one", "two", "three"} );
ms{}.update( "Hello", {"one", "two", "three"} );