C++ 如何将类型列表还原回其原始参数包

C++ 如何将类型列表还原回其原始参数包,c++,c++11,C++,C++11,我很难找到关于如何使用c++11可变类型列表作为便携式参数包容器的信息。假设我有这段代码 #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,

我很难找到关于如何使用c++11可变类型列表作为便携式参数包容器的信息。假设我有这段代码

#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> {};
#包括
模板
结构索引;
模板
结构索引:std::integral_常量{};
模板
结构索引:std::integral_常量{};
我可以使用它来查找参数包中类型的第一个索引,如下所示

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
}
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
}
intmain()
{
使用名称空间std;
cout
模板
使用指数t=std::积分常数;
模板
结构索引{};
模板
结构索引:
索引
{};
模板
结构索引:
指数<1+指数
{}

这种语法是不可能的,但问题可以通过多种方式解决。比如编写一个扩展器,它接受一个模板和一个列表,并将列表扩展到模板中。缺少细节,比如你可以重新定义
Index
,或者这仅仅是
Index
Index
只是一个例子,不管我的最佳答案是什么s、 索引只是一个例子。我还想将类型列表转换为其他函数的参数包,或者从类型列表构造元组。我可以重构像索引这样的代码来满足类型列表方法的需要,谢谢。因此,一个好的方法是重载类型列表的方法?
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 >
{}