如何从 std::vector 转换为 args

ser*_*rup 5 c++ vector variadic-functions

我有一个函数,它接受多个参数,如下所示:

void test(const auto&...args)
{
   typedef boost::variant<int, float, std::string> Variant;
   std::vector<Variant> vec = {args...}
}
Run Code Online (Sandbox Code Playgroud)

这很好用 - 根据 Variant,参数在向量中作为不同类型

我想从类似的向量中获取参数并将其放回一个接受 args 的函数中...

像这样:

args = vec;
test2(args);

void test2(const auto&...args);
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

Gui*_*cot 6

这是可以做到的。但由于向量的大小仅在运行时已知,因此大小不匹配的错误也必定会在运行时发生。

我是这样做的:

template<std::size_t... S>
void unpack_vector(const std::vector<Variant>& vec, std::index_sequence<S...>) {
    test2(vec[S]...);
}

template<std::size_t size>
void unpack_vector(const std::vector<Variant>& vec) {
    if (vec.size() != size) throw /* choose your error */;
    unpack_vector(vec, std::make_index_sequence<size>());
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它:

unpack_vector<6>(vec);
Run Code Online (Sandbox Code Playgroud)

请注意,此函数将向Variant函数发送实例test2

我必须承认这可能是一个坏主意,运行时错误并不是最好的。我建议您检查您的设计,以免需要它。


Sam*_*hik 3

不,这是不可能的。参数包必须在编译时确定,以便进行扩展。每个唯一类型的参数包都成为其自己唯一的函数调用,在编译时创建。

显然,向量的大小直到运行时才知道。从根本上来说,C++ 并不是这样工作的。