使用数组作为参数在C ++中调用variadic函数

时间:2016-01-25 13:51:00

标签: c++ variadic-templates

假设我有一个简单的可变函数,如下所示:

template <typename... A>
void func(A... args)
{
    //Do stuff
}

我需要另一个函数来调用数组中的参数,比方说:

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

调用函数

func(1,2,3);

是否可以在不修改模板化功能的情况下执行此操作?

1 个答案:

答案 0 :(得分:5)

你可以编写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);

Live Demo