如果你的编译器支持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());
}
Live Demo
对于C++ 11在此基础上SO answer你可以编写一些额外的机器做如下(尚未虽然测试):
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>());
}
Live Demo
我想你可能会寻找一个['的std :: integer_sequence'(http://en.cppreference.com/w/cpp/utility/integer_sequence) – NathanOliver
@NathanOliver - - 如果参数的类型可能是“int”以外的东西呢? – Louen
我看到了使它具有通用性的两个问题:从容器中创建一个元组,并将元组解包到参数包中。后一部分[已经完成](http://stackoverflow.com/a/1547118/440558),这留下了我不幸不知道该怎么做的元组的创建。 –