Template Metaprogramming

发布时间 2023-07-15 19:46:30作者: 夏一锐的blog
#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;
}