固定大小的容器到可变参数模板参数列表转换

Lou*_*uen 4 c++ variadic-templates c++11

我必须调用一个可变参数模板函数,它可以接受任意数量的参数.

template < class ... Args >
void f( Args&... args);
Run Code Online (Sandbox Code Playgroud)

我希望编写一个小的包装器函数,以便我可以调用f包含在固定大小容器(如std :: array)中的相同类型的N个参数.

目标是写出类似的东西

std::array<int, 3> arr = {1,2,3};
wrapper(arr); // calls f(1,2,3);
Run Code Online (Sandbox Code Playgroud)

我试图使用初始化列表的一些组合,std::forward但无济于事.有没有办法实现我想要的?

101*_*010 7

如果您的编译器支持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());
}
Run Code Online (Sandbox Code Playgroud)

现场演示

对于基于这个SO答案的 C++ 11,你可以编写一些额外的机器并按下面的方式执行(尽管没有测试):

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>());
}
Run Code Online (Sandbox Code Playgroud)

现场演示