模板
1 模板是一种参数化的多态工具。
2 所谓参数化的多态性,是指将程序所处的对象的类型参数化,使一段程序代码可以用于处理多种不同类型的对象。
3 采用模板编程,可以为各种逻辑功能相同面而数据类型不同的程序提供一种代码共享的机制。
模板分为两种
函数模板和类模板。
函数模板:
形式:
template <模板形参表>
返回值类型 函数名(模板函数形参表)
{
}
template <typename T>
const T& max(const T& a, const T& b)
{
return a < b ? b : a;
}
函数模板的参数是类型参数,其类型为class或typename;
模板形参在模板中作为一种类型使用,可以用于函数的形参,函数返回值和函数的局部变量。
每个模板形参要在函数的形参列表中至少出现一次。
模板参数名的作用域限于函数模板的范围内。
使用方法:
函数模板不是函数,不能被执行。
转换代码中的类型参数得到模板函数,称为模板实例化。
实例化的模板函数是真正的函数,可以被执行。
模板会被编译两次:
1 实例化之前,先检查模板代码本身,查看语法是否正确。在这里会发现语法错误,如遗漏分号等等。
2实例化期间,检查模板代码,查看是否所有的调用都有效。在这里会发现无效的调用,如该实例化类型不支持某些函数调用等。
普通函数只需要声明,即可顺利编译,而模板的编译需要查看模板的定义。
所带来的问题是:
如果在头文件中 实现函数声明。 而函数的定义实现在.cpp文件中。那么模板函数编译的时候就会编译不过,因为看不到函数的定义。
解决方案:
模板函数的定义和声明都实现在头文件中。
模板函数特化:
原型:
template<>
const char* const& max<const char*>(const char* const& a, const char* const& b)
{
return strcmp(a, b) < 0 ? b : a;
}
而直接调用模板函数,比较的是指针的地址大小。此时我们需要实现函数模板的特化版本。
类模板和函数模板的区别
1 类模板需要显示实例化。 类模板也要先创建类的实例,再创建实例对象,这点和模板函数相同。但是模板函数可以自动推导。而类模板要显示实例。
2 类模板 模板参数并不局限于类型,普通值也可以作为模板参数。