c++ - 有没有办法将容器值传递给可变参数函数?

标签 c++ c++11

我有一个模板可变参数函数:

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 */);

最佳答案

不,你不能。 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});

关于c++ - 有没有办法将容器值传递给可变参数函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168150/

相关文章:

c++ - 为什么 push_back 有两个左值和右值重载?

c++ - 用作一维的多维 vector 的迭代器?

C++多级虚继承编译问题

c++ - 在 C 或 C++ 代码中以编程方式为 Linux 上的 gdb 设置断点

c++ - 合并 K 排序列表中大小 2 列表的错误

c++ - 现实程序中来自 c++ <random> 库的随机数生成器

c++ - 如何使用 -std=c++11 : ‘auto_ptr’ is deprecated 解决 g++ 警告

c++ - 为什么将空结构插入保留 vector 会增加内存?

c++ - 为套接字轮询/选择设置超时值的最佳做法是什么?

c++ - 如何避免 lambda 函数中的隐式移动构造函数