Template Metaprogramming

发布时间 2023-07-15 19:39:24作者: 夏一锐的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;
};
int main(){
	
	return 0;
}