#include<bits/stdc++.h>
using namespace std;
template<typename...>struct TypeList;
template<typename Head,typename...Tails>
struct TypeList<Head,Tails...>{
using head=Head;
using tails=TypeList<Tails...>;
};
template<>struct TypeList<>{};
template<typename TList,unsigned int index>struct TypeAt;
template<typename Head,typename...Args>
struct TypeAt<TypeList<Head,Args...>,0>{
using type=Head;
};
template<typename Head,typename...Args,unsigned int i>
struct TypeAt<TypeList<Head,Args...>,i>{
static_assert(i<sizeof...(Args)+1,"i out of range");
using type=typename TypeAt<TypeList<Args...>,i-1>::type;
};
template<typename TList,typename T>struct IndexOf;
template<typename Head,typename...Tails,typename T>
struct IndexOf<TypeList<Head,Tails...>,T>{
private:
using Result=IndexOf<TypeList<Tails...>,T>;
public:
static constexpr int value=is_same<Head,T>::value?0:
(Result::value==-1?-1:Result::value+1);
};
template<typename T>
struct IndexOf<TypeList<>,T>{
static constexpr int value=-1;
};
template<typename,typename>struct Append;
template<typename...TList,typename T>
struct Append<TypeList<TList...>,T>{
using result_type=TypeList<TList...,T>;
};
template<typename T,typename...TList>
struct Append<T,TypeList<TList...>>{
using result_type=TypeList<T,TList...>;
};
template<typename...TListLeft,typename...TListRight>
struct Append<TypeList<TListLeft...>,TypeList<TListRight...>>{
using result_type=TypeList<TListLeft...,TListRight...>;
};
template<typename TList,typename T>struct Erase;
template<typename Head,typename...Tails,typename T>
struct Erase<TypeList<Head,Tails...>,T>{
using result_type=typename Append<Head,typename Erase<TypeList<Tails...>,T>::result_type>::result_type;
};
template<typename...Tails,typename T>
struct Erase<TypeList<T,Tails...>,T>{
using result_type=TypeList<Tails...>;
};
template<typename T>
struct Erase<TypeList<>,T>{
using result_type=TypeList<>;
};
int main(){
return 0;
}
标签:Metaprogramming,TypeList,result,template,using,Template,type,struct
From: https://www.cnblogs.com/2021changqing52/p/17556736.html