资讯详情

博洋教育C++培训:初识c++模板元编程

2012-09-24 阅读:330 来源:福州博洋教育
进入>

模板元编程(Template metaprogramming,简称TMP)是编译器内执行的程序,编译器读入template,编译输出的结果再与其他源码一起经过普通编译过程生成目标文件。通俗来说,普通运行程序是编译器生成的机器码,由处理器解释执行得到结果,TMP则是编译器实例化template过程中得到结果。TMP已被证明是图灵完备的机器,不过模板实例化通常需要消耗巨大的编译器资源,而且难以追踪错误,没有合适的调试器,所以在实际开发中很少使用。

TMP有两个重要的作用:

将工作从运行期转移到编译期,一些在运行期才能发现的错误在编译时就找出来了。

产生较小的可执行文件,较短的运行时间,较少的内存需求。当然代价就是增加了编译时间。

下面让我们来看一个利用TMP计算3的幂的例子

template

class Pow3 {

public:

enum {result=3*Pow3::result};

};

template<>

class Pow3<0> {

public:

enum {result=1};

};

int main() {

std::cout《"Pow3<7> = "《Pow3<7>::result《std::endl;

}

Pow<7>的实例化导致Pow3<6>的实例化,Pow3<6>又出发Pow3<5>的实例化,递归直至Pow3<0>结束,Pow<7>::result直接被常量值替换。

一个TMP程序可以包含以下几部分:

状态变量:即模板参数

迭代构造:TMP没有循环等构件,全部用递归实现,另一方面递归的实例化也是降低编译器效率的主要原因。

路径选择:通过使用条件表达式或者特化。

整形算法(即枚举)

c++中,在类内部声明常量值只有枚举和静态常量初始化两种方式。上面的例子中可以将枚举改成静态常量,

template

class Pow3 {

public:

static int const result=3*Pow3::result;

};

template<>

class Pow3<0> {

public:

static int const result=1;

};

不过静态常量是左值,如果将结果作为引用参数传递给一个函数,

void foo(int const&);

foo(Pow3<7>::result);

编译器必须获取 Pow3<7>::result的地址,这会强制编译器实例化静态成员的定义,并分配内存,这就跳出了编译期范围。

而枚举不是左值,没有这个约束,通过引用传递的时候跟使用常量值形式是一样的,所以一般都用枚举类型。

博洋教育(http://www.softfz.com/)教师简介:彭坤容,高级C语言讲师,12年教学经验。

1、做项目拥有一个团结、合作的团队非常重要。

2、做项目时,从一开始一定要想好算法,然后按算法做才会事半功倍。在做的过程中,肯定会遇到难点,那么所要做的就是选择最适合自己的方法做下去,它不一定是最好的,但确是自己最熟悉的,这样就会很快的先把东西做出来,以后有时间再去研究如何改进。无论怎么做,提高的都是技术。这些技术如果以后还用得到,提高的就是做项目的进度。

3、做开发,C语言功底还是十分重要的。有了好的功底,学什么语言都会很快,以后做项目多了,相关知识就会很快融会贯通。

加载全文

免责声明:本站部分内容、图片来自用户自主上传,如果您对本站信息资源版权的归属问题存有异议,请您致信,我们会立即做出答复并及时解决。如果您认为本站有侵犯您权益的行为,请通知我们,我们一定根据实际情况及时处理。

以上是福州博洋教育为大家整理的有关博洋教育C++培训:初识c++模板元编程的全部内容,更多精彩请访问学习资讯新闻专栏。
上一篇:

相关课程

更多>
2020猎学网广告栏
申请课程免费试听名额

课程顾问24小时内联系您

你好

顾问将于24小时内联系您!

确定
在线咨询 微信咨询 立即报名
申请1对1课程顾问咨询服务
×
你好

顾问将于24小时内联系您!

确定
福州猎学网 >福州博洋教育 >博洋教育C++培训:初识c++模板元编程