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

时间:2015-06-25 15:04:23

标签: c++ templates c++11 variadic-templates c++14

有没有办法将类型参数包转换为从0sizeof...(Types)的整数参数包?更具体地说,我试图做这件事:

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

template <typename... Types>
  void foo() {
    bar<WHAT_GOES_HERE<Types>...>();
  }

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

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

1 个答案:

答案 0 :(得分:10)

在C ++ 14中,您可以使用std::index_sequence_for标题中的<utility>以及带标记的调度。这被称为 indices trick

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

template <typename... Types>
void foo() {
    bar(std::index_sequence_for<Types...>{});
}

如果您仅限于C ++ 11,您可以在线找到上述的许多实现,例如this one