Loki中的TypeList,是需要递归定义的,并且需要一个NullType作为尾节点。
可变模板参数使得实现TypeList更简洁,更易懂。
以下是我用C++11实现TypeList。
复制代码
//////////////////////////////////////////////////////////
template
struct typelist
{
};
typedef typelist<> nulllist;
//////////////////////////////////////////////////////////
template struct length;
template
struct length< typelist >
{
enum { value = sizeof...(TList) };
};
//////////////////////////////////////////////////////////
template struct push_front;
template
struct push_front< T, typelist >
{
typedef typelist type;
};
//////////////////////////////////////////////////////////
template struct pop_front;
template
struct pop_front< typelist >
{
typedef typelist type;
};
template<>
struct pop_front< nulllist >
{
typedef nulllist type;
};
//////////////////////////////////////////////////////////
template struct at;
template
struct at< N, typelist >
{
typedef typename at< N-1, typelist >::type type;
};
template
struct at< 0, typelist >
{
typedef T type;
};
template<>
struct at< 0, nulllist >
{
typedef nulllist type;
};
//////////////////////////////////////////////////////////
template
struct IndexFixer
{
enum { value = (A == B) B : A + 1 };
};
//////////////////////////////////////////////////////////
template struct indexof;
template
struct indexof< T, typelist >
{
enum { value = IndexFixer>::value, -1>::value };
};
template
struct indexof< T, typelist >
{
enum { value = 0 };
};
template
struct indexof< T, nulllist >
{
enum { value = -1 };
};
//////////////////////////////////////////////////////////
template struct concat;
template
struct concat, typelist >
{
typedef typelist type;
};
template
struct concat, T >
{
typedef typelist type;
};
template
struct concat< T, typelist >
{
typedef typelist type;
};
//////////////////////////////////////////////////////////
template struct erase;
template
struct erase >
{
typedef typename concat >::type>::type type;
};
template
struct erase >
{
typedef typelist type;
};
template
struct erase
{
typedef nulllist type;
};
//////////////////////////////////////////////////////////
template struct erase_all;
template
struct erase_all >
{
typedef typename concat >::type>::type type;
};
template
struct erase_all >
{
typedef erase_all< T,typelist > type;
};
template
struct erase_all >
{
typedef U type;
};
template
struct erase_all
{
typedef nulllist type;
};
//////////////////////////////////////////////////////////
template struct no_duplicate;
template
struct no_duplicate< typelist >
{
private:
typedef typename no_duplicate< typelist >::type inner;