模板

模板属于一种参数化的多态。类型也可以当做一种参数来传递。为不同的类型参数提供代码共享机制。

模板包括函数模板,类模板。

函数模板应实例化出模板函数才能被使用。

template<typename T>
const T& maxvalue(const T &a, const T &b)
{
return a > b ? a : b;
}在运行时会实例化出模板函数,将T替换为需要的类型。

模板会被编译两次,一次是在实例化之前,一次实在实例化过程中。

与define相比,模板函数在运行时会进行类型检查。在编译过程中,模板会检查自身是否有语法错误。在实例化期间,检查调用的类型是否允许函数操作。

我们在编译过程中,必须确保模板函数可以得知类型的代码体。也就是说,不能将模板的声明与模板的定义分开放置。分开放置的时候就不能正确推导,以及实例化。

如果分开放置,需要在.h 文件最后声明#include".cpp",同时cpp文件中不能再include .h。

模板的与函数不同,函数声明就可以自动编译,而模板需要定义才能顺利编译。

函数模板同样需要进行特化。

maxvalue(const char* ,const char*);此时比较的不是两个字符串的大小,而比较的是两个指针的大小。没有得到我们想要的结果,此时我们就需要对其进行特化。

template<>

const char* maxvalue(const char* const a,const char* const b)

{

  return strcmp(a,b)?a:b;

}这时返回的就是字符串比较之后的结果。

函数模板同样也可以进行重载。非模板函数重载不属于函数模板,属于全局函数。所以在函数匹配过程中,会首先寻找全局函数进行匹配,在去跟模板函数进行匹配。特化函数本身还属于模板函数。

为了可以确保调用模板函数,我们也可以显示指定模板函数maxvalue<>或者maxvalue<int>。

 

posted @ 2017-04-06 18:05  冥地魔王  阅读(113)  评论(0)    收藏  举报