C++将类型的参数包转换为索引的参数包

Mat*_*nte 5 c++ templates variadic-templates c++11 c++14

有没有什么办法的类型参数包从转换为整数的参数包0sizeof...(Types)?更具体地说,我正在尝试这样做:

template <size_t... I>
  void bar();

template <typename... Types>
  void foo() {
    bar<WHAT_GOES_HERE<Types>...>();
  }
Run Code Online (Sandbox Code Playgroud)

例如,foo<int,float,double>()应该打电话bar<0, 1, 2>();

在我的用例中,参数包Types可能多次包含相同的类型,因此我无法搜索包以计算给定类型的索引.

Tar*_*ama 11

在C++ 14可以使用std::index_sequence_for<utility>标头标记派遣一起.这被称为指数技巧:

template <std::size_t... I>
void bar(std::index_sequence<I...>);

template <typename... Types>
void foo() {
    bar(std::index_sequence_for<Types...>{});
}
Run Code Online (Sandbox Code Playgroud)

如果你只限于C++ 11,你可以在网上找到上述的许多实现,比如这个.

  • @RyanHaining必须至少有6个`integer_sequence`的实现和仅在SO上的朋友. (4认同)