Type List

后面再补, 先上码

#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是利用递归模板. 实例化自身作为定义的一部分. 同时第一个的完全实例化是边界条件, 防止无限递归.

猜你喜欢

转载自blog.csdn.net/creambean/article/details/89164572
今日推荐