现在的位置: 首页 > 综合 > 正文

模板之Typelists

2018年03月30日 ⁄ 综合 ⁄ 共 1611字 ⁄ 字号 评论关闭
文章目录

1 Typelists 是一个只携带类型信息的列表

它的实体是空的,不含任何状态,也未定义任何函数。

namespace TL
{
	template <class T, class U>
	struct Typelist
	{
		typedef T Head;
		typedef U Tail;
	};
}

Typelist 接受两个参数,我们总可以“将一个参数置换为另一个 Typelist 来达到无限延伸的目的。

问题:我们可以表达出持有两个或更多型别的 typelists ,但无法表达出持有零个或一个型别的typelist。怎样实现一个null list type?

实现:规定每个typelist 都必须以 NullType (前面有提到)结尾。 NullType 可视为一个结束记号,类似传统C 风格的 \0 功能。

定义一个持有单一元素的 typelist  和 多个元素的 typelist 如下:

class NullType; // 只声明一个 NullType类型

// one type
typedef Typelist<int, NullType> OneTypeOnly;

// CharList 
typedef Typelist<char, Typelist<signed char, Typelist<unsigned char, NullType> > > CharList;

2 将 Typelist 的生成线性化

#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_50(...) ...
// 使用上述宏定义 SignedIntegrals
typedef TYPELIST_4(signed char, short int, int, long int) SignedIntegrals;

3 计算长度

// 计算长度
template <class TList> struct Length;
template <> struct Length < NullType > // null typelist 的长度为 0
{
	enum { value = 0 };
};
template <class T, class U>
struct Length < Typelist<T, U> >
{
	enum { value = 1 + Length<U>::value };
};

4 “C++编译期编程” 工具

template & 编译器整数计算 & typedefs:

template,更明确地说是指 template specialization(模板特化)提供编译期间的 if 叙述。特化版本能够在 typelists 和其他型别之间形成差异。

Integer calculations (整数计算)提供真实的数值计算能力,用以从型别转为数值。但,所有编译期数值都是不可变的(immutable),一旦你为它定义了一个整数常数,例如一个枚举值,就不能再改变它(也就是不能重新赋予他值)。

typedefs 可被视为用来引进“具名的型别常数”(named type constants)。他们也是定以后就被冻结,不能将typedef 定义的符号重新定义为另一个型别。

5 编译器计算的特点

编译器计算有两点特点,是它根本上不兼容于迭代。

所谓迭代是持有一个迭代器(iterator)并改变它,直到某些条件吻合。由于编译期间我们并没有“可以变化的任何东西”(mutable entities),所以无法实现“迭代”。因此,虽然 C++ 是一种极重要的语言,但任何编译期运算所依赖的技术明显让人联想到过去的纯粹函数型(functional)语言--那些语言不会改变数量内容。所以,模板中的运算由递归实现。

抱歉!评论已关闭.