首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

C++学习札记(七) 模板与泛型编程

2012-08-01 
C++学习笔记(七) 模板与泛型编程模板简介模板是C一个非常重要的特性,它是C泛型编程的基础。某些对C持极度偏

C++学习笔记(七) 模板与泛型编程
模板简介模板是C++一个非常重要的特性,它是C++泛型编程的基础。某些对C++持极度偏见的人甚至说模板是C++对这个世界的唯一贡献(当然,我是不赞同的),可见模板在C++中的重要性,而整个STL都是基于模板的,可见其应用之广泛。

C++引入模板的一个重要原因是算法的重用,比如下面一个例子:

bool result = mless_than(2.8, 4.1);//double version
在某些情况下,编译无法从调用参数推到出所有的模板类型,或是我们传入的参数类型不是我们希望用于实例化函数的模板参数类型时,我们也可以手动的指定模板参数类型,调用方式如下:

template<unsigned N>class Factorial {public:unsigned VALUE = N*factorial<N-1>::VALUE;};template<>class Factorial<0> {public:unsigned VALUE = 1;};

上面的模板类Factorial用于计算阶乘,它巧妙的利用递归在编译器就可以计算出我们所需要的阶乘值,值得注意的是,这里的递归出口是一个偏特化模板,很神奇吧。模板的编译机制谈完模板的一些基本特性与使用方式,我们最后来看一下模板编译机制。我们知道,模板只是提供被编译器供编译器生成实例的一种方式。而模板是按需进行实例化的,也就是说,如果我们按照我们的习惯将类模板的定义放在头文件里,而将其成员函数的实现放在源文件中,在对定义源文件进行编译时是不会生成任何代码的,这样在其他使用文件中因为只包含器类的定义而不包含实现,在连接过程中就会发生找不到类的错误。所以我们的模板代码必须全部放在头文件中,如果你为了方便管理,也可以讲实现放在源文件中,再通过头文件进行反包含。有些童鞋可能会担心重定义的问题,实际上把模板放在头文件中,这种C++标准中是运行的,编译器对它做了特殊处理,所以不会有普特类的定义放在头文件中的担心。实际上在C++的标准中还有一个关键字export可以解决这个问题,不过由于目前还没多少编译器支持,所以这里也就不谈了。模板的编译机制是按需的,不仅对于类型按需,对于那些并没有使用到的成员函数,编译器也不会对它进行编译的,这点很重要。前段时间,在网上翻博客时就碰见一位仁兄讲述的一个例子,他自己做了一个简单的模板库,在测试的时候没有问题,但在实际的使用过程中却碰到了大麻烦。因为他在测试时,对于有些类型并没有用到所有的成员函数,而这些成员函数编译器就没有对它进行编译,这才使问题在使用期才暴露出来。所以,了解模板的编译机制,对于我们以后开发自己的模板库有很重要的作用。
(不得不吐槽:以后再也不相信CSDN的草稿功能了,昨晚上一晚上的编辑全浪费了!)参考文献:《C++ Primer》Stanley B.Lippman Barbara E.Moo《C++语言程序设计》 郑莉 董渊 何江舟

热点排行