如果您的编译器支持 C++14,您可以按以下方式执行此操作:
template <class ... Args>
void f(Args&&... args) {
...
}
template<typename T, std::size_t N, std::size_t... I>
void wrapper_impl(std::array<T, N> const &arr, std::index_sequence<I...>) {
f(arr[I]...);
}
template<typename T, std::size_t N,
typename Indices = std::make_index_sequence<N>>
void wrapper(std::array<T, N> const &arr) {
wrapper_impl(arr, Indices());
}
现场演示 http://coliru.stacked-crooked.com/a/77aa901fc3d216db
对于基于此的C++11所以答案 https://stackoverflow.com/questions/16834851/passing-stdarray-as-arguments-of-template-variadic-function您可以编写一些额外的机器并按如下方式执行(但尚未测试):
namespace detail {
template<std::size_t... Is> struct seq {};
template<std::size_t N, int... Is> struct gen_seq : gen_seq<N-1,N-1, Is...> {};
template<std::size_t... Is> struct gen_seq<0, Is...> : seq<Is...> {};
}
template <class ... Args>
void f(Args&&... args) {
...
}
template<typename T, std::size_t N, std::size_t... I>
void wrapper_impl(std::array<T, N> const &arr, detail::seq<I...>) {
f(arr[I]...);
}
template<typename T, std::size_t N>
void wrapper(std::array<T, N> const &arr) {
wrapper_impl(arr, detail::gen_seq<N>());
}
现场演示 http://coliru.stacked-crooked.com/a/7c07ffe7c9812bc1