没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
第
1
章
模板元编程(Ⅰ)
C++是一种功能强大到几乎可称为“万能”的语言,支持许多种不同的编程范式,而由 泛
型编程衍生出的模板元编程(template meta-programing,简称元编程)则无疑是其中
最复杂、最强大和最具威力的一种,可算得上是 C++的“终极”技巧(传说中的“大杀器”,笑)。
所谓“元程序”——metaprogram,意思就是“a program about a program”,它
有着完全不同于普通程序的许多特点,是一种全新的编程体验。作为本书的第一章,首先来
讨论模板元编程的一些基本概念,它们是许多 Boost 程序库组件的基础,了解模板元编程
有助于我们对 Boost 的进一步学习。
Boost 程序库探秘——深度解析 C++准标准库
第 1 章 Ⅰ模板元编程( )
1.1 模板元编程概述
元编程也可译为“超程序”、“超编程”或“产生式编程”,这个译法一定程度上反映了其本
质——它是一种位于普通程序之上、超越普通程序的程序,是一种可以操纵、产生程序的程
序。
C++中的模板元编程是无意中被“发现”而不是“发明”出来的,是一种对“类型”计算的程序 ,
关于它的诞生有许多有趣的传奇和故事。模板元编程本质上是泛型编程的一个子集,从广义
上来说,所有使用 template 的泛型代码都可以称作是元程序,因为泛型代码不是真正可
编译执行的代码,它们只是定义了代码的产生规则,是用来生成代码的“模板”。
然而模板元编程又不完全等同于泛型编程,它是一种“函数式编程”,并且已经被证明是
图灵完备的,也就是说它具有足够的“计算”能力,可以“计算”任何东西。模板元编程的执行
是在编译期,它把编译器变成了元程序的解释器,可以把 C++的类型体系像面团一样捏来捏
去,肆意打碎再任意组合起来,拥有近乎不可思议的“魔力”。
虽然模板元编程使用的是标准的 C++语言,遵循同样的语法规则,但它在编程思想、
编程范式等很多方面都与普通的运行时 C++程序有很大的不同。模板元编程产生的元程序是
在编译期执行的程序,操作的对象也不是普通的变量,因此不能使用运行时的 C++关键字
(如 if、else、for),可用的语法元素相当有限,最常用的是:
enum、static,用来定义编译期的整数常量;
typedef,最重要的元编程关键字,用于定义元数据;
template,模板元编程的“起点”,主要用于定义元函数;
“::”,域运算符,用于解析类型作用域获取计算结果(元数据)。
下面简单介绍模板元编程领域中的三个最基本的概念,熟悉它们才能够理解模板元编
程和元程序。当然元编程中远不止这些,还有 lambda 表达式、容器、迭代器、算法、视图
等更高级的概念,它们将在本书的第 11 章叙述。
1.1.1 元数据
元编程可操作的数据就称为“元数据”(meta data),也就是 C++编译器在编译期可
Boost 程序库探秘——深度解析 C++准标准库
8
1.2 type_traits述
操作的数据,它是元编程的基础。
元数据都是不可变的,不能够就 地 修 改 , 最 常 见 的 元 数 据 是 整 数 和 C++ 的类型
(type)。
对于整数大家都很熟悉,普通程序在运行时也可以很容易地处理,但在模板元编程中
的元数据更多的是以类型(type)的面目出现。这些元数据不是普通的运行时变量,而是
如 int、double、class(非模板类)这样的抽象数据类型——这是模板元编程与普通运
行时编程的一个最根本的不同点,也是元编程的威力所在(类型的计算)和令初学者感到最
困惑的地方。
如果对元数据 再 进 行 细 分归 类,则元数据又可 以 分 成整数元 数 据 、值 型元 数 据
( int 、 double 等 POD 值 类 型 ) 、 函 数 元 数 据 ( 函 数 类 型 ) 、 类 元 数 据
(class、struct 等用户自定义类型)等等。为了更明确地表述元数据的概念,本书后面
的“元数据”一词特指非整数的类型元数据。
使用 typedef 关键字可以任意定义(声明)元数据,很像运行时的变量定义语句,
例如:
//元数据 meta_data1,值为 int
typedef int meta_data1;
//元数据 meta_data2,值为 vector<float>
typedef std::vector<float> meta_data2;
1.1.2 元函数
元函数(meta function)是模板元编程中用于操作处理元数据的“构件”,可以在编
译期被“调用”,因为其功能和形式类似运行时的函数而得名,是元编程中最重要的构件。
元函数实际上表现为 C++中的一个类或者模板类,它的通常形式是:
template<typename arg1, typename arg2,...> //元函数参数列表
struct meta_function //元函数名
{
typedef some-define type; //元函数返回的元数据
static int const value = some-int; //元函数返回的整数
}; //使用分号结束元函数的定义
编写元函数就像是编写一个普通的运行时函数,但形式上却是一个模板类:
函数参数列表圆括号()变成了模板列表声明的尖括号<>,函数的形参变成了模板参数
Boost 程序库探秘——深度解析 C++准标准库
9
剩余14页未读,继续阅读
资源评论
harord_lin
- 粉丝: 2
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功