后面再补, 先上码
#ifndef TYPELIST_H
#define TYPELIST_H
class NullType {};
template<class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
namespace TL
{
#define TYPELIST_1(T1) Typelist<T1, NullType>
#define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2)>
#define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3)>
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, TYPELIST_3(T2, T3, T4)>
#define TYPELIST_5(T1, T2, T3, T4, T5) Typelist<T1, TYPELIST_4(T2, T3, T4, T5)>
#define TYPELIST_6(T1, T2, T3, T4, T5, T6) Typelist<T1, TYPELIST_5(T2, T3, T4, T5, T6)>
typedef TYPELIST_4(signed char, short int, int, long int) SignedIntegrals;
// Calculating the length of the typelist
template<class TList> struct Length;
template<> struct Length<NullType>
{
enum { value = 0 };
};
template<class T, class U>
struct Length<Typelist<T, U> >
{
enum { value = 1 + Length<U>::value };
};
}
#endif // TYPELIST_H
测试
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
std::cout << "SignedIntegrals length is " << TL::Length<TL::SignedIntegrals>::value << std::endl;
return 0;
}
输出:
SignedIntegrals length is 4
解释
能计算typelist length是利用递归模板. 实例化自身作为定义的一部分. 同时第一个的完全实例化是边界条件, 防止无限递归.