如何将TypeList还原回其原始参数包

时间:2016-10-17 23:21:23

标签: c++ c++11

我无法找到有关如何将c ++ 11可变参数TypeLists用作便携式参数包的容器的信息。假设我有这段代码。

#include <type_traits>

template <typename T, typename... Ts>
struct Index;

template <typename T, typename... Ts>
struct Index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};

template <typename T, typename U, typename... Ts>
struct Index<T, U, Ts...> : std::integral_constant<std::size_t, 1 + Index<T, Ts...>::value> {};

我可以用它来查找参数包中类型的第一个索引。

int main() 
{
using namespace std;

cout << Index<int, int>::value << endl;                //Prints 0
cout << Index<char, float, char>::value << endl;       //Prints 1
cout << Index<int, double, char, int>::value << endl;  //Prints 2
}

如何为TypeList实现此行为?我试图创造这样的东西。

template <typename ...>
struct TypeList {};

int main() 
{
using namespace std;
using List = TypeList<char, short, long>

cout << Index<short, ConvertToParameterPack<List>::types...>::value << endl;  //Prints 1
}

其中ConvertToParameterPack是将TypeList恢复为其ParameterPack的一种方法。如果我提出的问题是不可能的,还有其他好方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

template<std::size_t I>
using index_t=std::integral_constant<std::size_t,I>;

template<class T, class List>
struct Index{}; 

template<class T, class...Ts>
struct Index<T, TypeList<T,Ts...>>:
  index_t<0>
{};

template<class T,class U, class...Ts>
struct Index<T, TypeList<U,Ts...>>:
  index_t< 1+Index<T,TypeList<Ts...>::value >
{}