模版元初识

来源:互联网 发布:java button 样式 编辑:程序博客网 时间:2024/05/29 04:18

C++提供的模版语法,在语言层面上带来了巨大的灵活性,当然也无意中加深了C++学习的难度。模版特性的引入,得到发展的模版元编程,重新刷新了发明模版时对它的认识。1998年在德国的泛型编程研讨会上,Dave见到了使用C++模版实现的Lisp语言。以此为基础,发展了Boost元编程库:第一个设计用于将编译期C++从一个特别的“模版技巧”集合转变为正规的、易于理解的软件范例程序库。从最初的仅限于快速科学数值计算,逐步发展和完善,人们认识到它是一个完整的泛型编程技术。

元程序

元程序“metaprogram”的字面含义是“一个关于另一个程序的程序”。事实上,确实就是这样理解,就是用于操作其他程序代码的程序。所有需要编译的语言的编译器都是这种类型的程序,用来将用户写好的程序进行编译(操作)。
元函数:一个操作元数据并可以在编译期间“调用”的函数。
元数据:分为类型数据和非类型数据。类型数据对应模板类的参数,非类型数据对应非类型模板类或普通类的整形常量(包括bool和char)。
元程序有一个特点就是,只要一个元程序写好了,而且能正常工作,那么就能放心使用,不用关系底层实现机制。
元程序涉及到对程序的操作,因此存在两个步骤。
1. 将原始程序A进行某种操作,得到中间程序B
2. 中间程序B进行对应的解释等操作得到可执行的机器程序

这里涉及到的原始程序A称为领域语言,B称为宿主语言。对于C++原生提供模版语法的程序语言,领域语言就是宿主语言。模版元编程就是基于C++的模版编写的执行于编译器内的程序。执行结束之后,就是从template具体化(实例化)得到的C++代码。这种编程方式并非从发明之时而来,而是在不断实践过程中被发现的,而且已经被证明为“图灵完全”机器,可以声明变量、执行循环、编写及调用函数等,但是这些构件的实现与普通C++代码的实现方式是不同的。模版元编程有两个非常重要的优点:
1. 使得某些事情更容易,没有它将实现困难或者不可能;
2. 将运行期的工作转移到编译期间,因此某些在运行期间的错误转移到编译期间。从而也导致更高效:较小的可执行文件、较短的运行期、较少的内存需求。

但是,唯一的问题就是,程序的编译时间变得很长。

模版元编程的作用

  1. 确保度量单位正确:使用TMP,可以确保在编译期间程序中所有度量单位的组合都正确
  2. 优化矩阵运算:对于大的矩阵运算,TMP能在编译期间合并循环,避免创建较大的矩阵对象,能够减少占用的内存
  3. 类型计算:编译期间能进行类型计算,这个最明显的就是STL中广泛使用的type traits技术。

进行元编程的时机

  1. 希望代码根据问题领域的抽象进行表达。如数组算术使用“针对矩阵或向量对象”的运算符合编写而成,而不是一系列数值的循环编写而成。
  2. 当不使用模版元编程时需要编写大量的刻板的实现代码。
  3. 需要基于组件的类型参数的属性来选择组件实现。
  4. 希望利用C++泛型编程这个特性,实现静态类型检查、行为定制等。

简单实例

C++模版作为C++的语言的一个子集,是元编程的领域语言。除了顺序结构外,这里给出了另外两种基本程序语言结构——条件和循环——的实现方式。

条件

//这是if语句的条件判断式的两个标识struct false_tag{};struct true_tag{};template<typename A>void func(A & i, false_tag ){    //do some thing when condition is false....}template<typename A>void func(A & i, true_tag ){    //do some thing when condition is true....}

循环

使用递归模版实例化,可以用模版语法实现普通循环结构:

//递归模版实例化版本template <unsigned long N>class Binary{const static unsigned value = Binary<N / 10>::value * 2 + N % 10;};template<>Binary<0>{const static unsigned value = 0;};//普通循环版本unsigned Binary(unsigned long N){    unsigned res = 0;    for(unsigned i = 1; N > 0; N /= 10, i <<= 1){        if (N % 10)            res += i;    }    return res;}

模版元编程是一种被发现的特性,存在Boost模版元编程库,为程序开发带来了新的天地。

0 0
原创粉丝点击