用数组作为参数在C++中调用可变参数函数

7
假设我有一个简单的可变参数函数,如下所示:
template <typename... A>
void func(A... args)
{
    //Do stuff
}

我需要另一个函数从数组中调用参数,比如说:

int arg[3] = {1,2,3};

调用函数

func(1,2,3);

这可以在不修改模板函数的情况下完成吗?

1
也许你可以编写一个(同样是模板化的)包装函数,将参数应用于原始函数。 - gorhawk
1个回答

10
您可以编写一个apply函数,该函数接受一个数组引用和一个要调用解包后数组的函数对象(您可能需要添加完美转发等功能):
template <typename F, typename T, std::size_t N, std::size_t... Idx>
decltype(auto) apply_impl (F f, T (&t)[N], std::index_sequence<Idx...>) {
    return f(t[Idx]...);
}

template <typename F, typename T, std::size_t N>
decltype(auto) apply (F f, T (&t)[N]) {
    return apply_impl(f, t, std::make_index_sequence<N>{});   
}

如果 foo 是一个函数对象类,则可以按照以下方式进行调用:

apply(foo{}, a);

如果foo只是一个类似于你示例中的普通模板函数,你可以将其包装在一个lambda表达式中:
apply([](auto...xs){foo(std::forward<decltype(xs)>(xs)...);}, a);

实时演示


如果我想向该模板传递多种类型,例如,我想调用foo("a", 1, 3.0)。你有什么提示吗? - Fynn
使用std::tuple和相同的方法,将t[Idx]替换为std::get<Idx>(t),并将数组引用替换为元组。 - TartanLlama
但是我也不知道我得到的元素的类型,可能是 foo("a") 或者 foo(1,2.0)。否则,我最终会遇到指定 std::tuple 时遇到的同样问题。所以我只有一对列表,例如,第二个值指定了类型,这仍然可以完成吗?! - Fynn
@Fynn 我不确定我理解了你的问题。我建议你提出另一个问题,详细说明你的问题。 - TartanLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接