c++模板

来源:互联网 发布:linux nslookup找不到 编辑:程序博客网 时间:2024/06/10 17:31


模板与泛型编程

(1)首先关于几个概念,像这样

template<class U,class V>template<tpyename T>

上述两个关键字 class typename有完全相同过的含义,可以互换使用。

是模板的定义,下面的定义语句分别是声明函数模板

<pre name="code" class="cpp">template<tpyename T>int compare(const T &v1,const T &v2)template<tpyename T>int compare2(const T &v1,const T &v2)

类模板与之类似。注意,我们在这里不说是模板函数,而说是函数模板,是因为实际上上述的表达就不是一个函数,而是一个可以实例化为函数的模板。我们可以看到,此时,模板不过是函数模板的一部分。(一句话,函数模板和类模板也是模板。)

就像在不同函数的形参列表中形参名字可以相同,且没有任何联系一样,不同模板可以使用相同的模板名字。就像上面所显示一样。

上面的模板中,T称为模板的类型形参,v1和v2则成为模板的非类型形参。


(2)关于泛型程序

在使用模板技术后,我们有能力编写出和类型无关的代码,我们将其称之为泛型程序。一般有下面两个原则:

a模板的形参请使用const类型的引用(因为很多类型是禁止复制的,这样在编译器试图实例化时就会出错)

b尽量减少在模板中实现中所用到的操作符。比如说可以用==和!=完成就别用<,而使用了小于号就别使用大于号了


(3)模板的编译模型(只讨论包含编译模型)

在你使用函数时,编译器只需要看到函数的声明就好了。类似的,定义对象的事后,编译器只要看到类的定义即可,所以,一般类的定义和函数的声明被放在头文件中。

然而模板则不同,当你在调用函数模板或类模板时,由于编译器需要进行实例化,所以一并需要该模板的定义。所以你必须在头文件结束时讲对应的实现cpp文件include到该头文件中。


0 0
原创粉丝点击