您的位置:首页 > 编程语言 > C语言/C++

[C++模板技术] TypeList(2)

2017-08-22 19:42 183 查看
基于上一篇,这里接着给出针对TypeList的系列操作。就如同求一个TypeList的长度一样,我们依旧需要利用大量的递归技术。

1、随机访问

template <typename TList,unsigned int index>
struct TypeAt;

template <typename Head,typename Tail>
struct TypeAt<TypeList<Head,Tail>,0>
{
using Result = Head;
};

template <typename Head,typename Tail,unsigned int index>
struct TypeAt<TypeList<Head, Tail>, index>
{
using Result = typename TypeAt<Tail, index - 1>::Result;
};

2、类别索引查找

template <typename TList,typename T>
struct IndexOf;

template<typename T>
struct IndexOf<NullType, T>
{
enum
{
value = -1;
};
};

template<typename T, typename Tail>
struct IndexOf<TypeList<T, Tail>, T>
{
enum
{
value = 0
};
};

template <typename Head,typename Tail,typename T>
struct IndexOf<TypeList<Head, Tail>, T>
{
private:
enum
{
temp = IndexOf<Tail, T>::value
};
public:
enum
{
value = temp == -1 ? -1 : temp + 1
};
};

3、附加元素

template<typename TList,typename T>
struct Append;

template<>
struct Append<NullType, NullType>
{
using Result = NullType;
};

template<typename T>
struct Append<NullType, T>
{
using Result = TypeList<T, NullType>;
};

template<typename Head,typename Tail>
struct Append<NullType, TypeList<Head, Tail>>
{
using Result = TypeList<Head, Tail>;
};

template<typename Head,typename Tail,typename T>
struct Append<TypeList<Head, Tail>, T>
{
using Result = TypeList<Head, typename Append<Tail, T>::Result>;
};

4、删除特定类型

template<typename TList,typename T>
struct Erase;

template<typename T>
struct Erase<NullType, T>
{
using Result = NullType;
};

template<typename Tail,typename T>
struct Erase<TypeList<T, Tail>, T>
{
using Result = Tail;
};

template<typename Head,typename Tail,typename T>
struct Erase<TypeList<Head, Tail>, T>
{
using Result = TypeList<Head, typename Erase<Tail, T>::Result>;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息