模版元初识
来源:互联网 发布: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. 将运行期的工作转移到编译期间,因此某些在运行期间的错误转移到编译期间。从而也导致更高效:较小的可执行文件、较短的运行期、较少的内存需求。
但是,唯一的问题就是,程序的编译时间变得很长。
模版元编程的作用
- 确保度量单位正确:使用TMP,可以确保在编译期间程序中所有度量单位的组合都正确
- 优化矩阵运算:对于大的矩阵运算,TMP能在编译期间合并循环,避免创建较大的矩阵对象,能够减少占用的内存
- 类型计算:编译期间能进行类型计算,这个最明显的就是STL中广泛使用的type traits技术。
进行元编程的时机
- 希望代码根据问题领域的抽象进行表达。如数组算术使用“针对矩阵或向量对象”的运算符合编写而成,而不是一系列数值的循环编写而成。
- 当不使用模版元编程时需要编写大量的刻板的实现代码。
- 需要基于组件的类型参数的属性来选择组件实现。
- 希望利用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模版元编程库,为程序开发带来了新的天地。
- 模版元初识
- c++模版元编程
- c++模版元编程
- 非模版友元
- 逆元 模版
- 初识Django-模版文件templates
- 什么是模版元编程技术
- C++11模版元编程
- c++ 函数模版,类模版,实例化,具体化,模版作参数,模版的友元
- 模版元编程,我记住了
- C++11模版元编程的应用
- 常规友元函数,模版友元函数以及友元类.
- [c++ primer plus]c++ 函数模版,类模版,实例化,具体化,模版作参数,模版的友元
- [c++ primer plus]c++ 函数模版,类模版,实例化,具体化,模版作参数,模版的友元
- UML初识__基本图元
- 友元函数,模版,搞到一起了终于
- 在类模版中写友元类和友元函数
- 友元函数在模版类中的使用方法举例
- 《JAVA夜未眠》读感
- C++ 设计模式 —— 访问者(Visitor)
- Codeforces--366A--Dima and Guards(水题)
- github更新自己Fork的代码
- Java注释@interface的用法【转】
- 模版元初识
- Linux学习笔记
- C/C++动态分配二维数组
- 《C++》07 C++ 指针
- 关于iPhone尺寸与分辨率
- 大数据学习平台
- STL中vector、list、deque和map的区别
- mac osx下brew install mysql 错误总结
- IOS开发之单例