有没有办法将容器值传递给变异功能

Is there a way to pass container values to a variadic function?

本文关键字:变异 功能 值传 有没有      更新时间:2023-10-16

我有一个模板变量函数:

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};

现在有什么方法可以用这些容器的值调用variadic函数,还是我必须更改该函数,以便它接受容器作为参数?如果可能的话,我想做这样的事情:

Call("add2", /* use v1 here */);
Call("add3", /* use v2 here */);
Call("true", /* use v3 here */);

不,你不能。vector中的元素数量是一个运行时数量,而传递给函数的参数数是编译时数量。将vector解放到类似函数的唯一方法是通过巨型开关语句的内容:

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});