我有一个模板可变参数函数:
template <typename ... argsType>
static bool Call(std::string const& Key, argsType&& ... Args)
{
/* ... */
}
这就是这样称呼的:
Call("add2", 1, 2);
Call("add3", 1, 2, 3);
Call("true", true);
然后我也有不同的容器,其中包含可变数量的元素:
std::vector<int> v1 = {1, 2};
std::vector<int> v2 = {1, 2, 3};
std::vector<bool> v3 = {true};
现在有没有办法用这些容器的值调用可变参数函数,或者我是否必须更改该函数以便它接受容器作为参数?如果可能的话,我想做这样的事情:
Call("add2", /* use v1 here */);
Call("add3", /* use v2 here */);
Call("true", /* use v3 here */);
答案 0 :(得分:3)
vector
中的元素数是运行时数,传递给函数的参数数是编译时数。将vector
解压缩到类似函数中的唯一方法是通过巨大的switch语句:
switch (v.size()) {
case 0: Call("add2"); break;
case 1: Call("add2", v[0]); break;
case 2: Call("add2", v[0], v[1]); break;
// ...
}
可以在index_sequence
的帮助下生成,但前提是您知道v.size()
的实际限制。
你通常会做的只是传递一对迭代器:
template <class Iter>
static bool Call(std::string const& Key, Iter first, Iter last);
Call("add2", v.begin(), v.end());
或将其折叠成gsl::span
:
template <class T>
static bool Call(std::string const& Key, gsl::span<T> values);
Call("add2", gsl::span<int>{v});