- 模板是一种参数化的多态工具
- 所谓参数化的多态性,是指将程序所处理的对象的类型参数化,使一段程序代码可以用于处理不同类型的对象
- 采用模板编程,可以为各种逻辑功能相同而数据类型不同的程序提供一种代码共享的机制。
函数模板
形式
template <模板形参表> 返回值类型 函数名(模板函数形参表){ //函数定义体 }
函数模板的定义以关键字template开头
template之后的<>中是函数模板的参数列表
函数模板的参数是类型参数,其类型为class或typename
- template < class T >
- template < class T1, class T2>
模板形参在模版中作为一种类型使用,可以用于函数的形参、函数返回值和函数的局部变量
每个模板形参要在函数的形参列表中至少出现一次
模板参数的作用域局限于函数模板的范围内
函数模板的使用
函数模板为所有的函数提供位移的一段函数代码,增强了函数设计的通用性
使用函数模板的方法是先说明函数模板,然后实例化相应的模板函数进行调用执行
- 函数模板不是函数,不能被执行
- 置换代码中的类型参数得到模板函数——实例化
实例化后的模板函数是真正的函数,可以被执行
模板被变编译了两次
- 实例化之前,先检查模板代码的本身,查看语法是否正确;在这里会出现发现语法错误,如果遗漏分号等
- 实例化期间,检查模板代码,查看是否所有的调用都有效。在这里会发现无效的调用,如该实例化类型不支持某些函数的调用
普通函数只需声明,即可顺利编译,而模板的编译需要查看模板的定义
通常情况下,模板在头文件中就直接给出实现方法
#include <iostream>
using namespace std;
//函数模板
template <typename T>
const T& max(const T& a, const T& b)
{
cout << "template" << endl;
return a < b ? b : a;
}
//函数模板重载
template <typename T>
const T& max(const T& a, const T& b, const T&c)
{
cout << "template" << endl;
return ::max(a, b) < c ? ::max(a, b) : c;
}
//非模板函数重载
const int& max(const int& a, const int& b)
{
cout << "non template" << endl;
return a < b ? b : a;
}
//函数模板特化
template <>
const char* const& max(const char* const&a, const char* const&b)
{
cout << "template" << endl;
return strcmp(a, b) < 0 ? b : a;
}
//非模板函数重载
const char* const& max(const char* const&a, const char* const&b)
{
cout << "non template" << endl;
return strcmp(a, b) < 0 ? b : a;
}
int main(void)
{
const char* str1 = "aaa";
const char* str2 = "zzz";
cout << ::max(97, 100) << endl; //自动推导,优先使用非模板函数重载
cout << ::max(str1, str2) << endl; //自动推导,优先使用非模板函数重载
cout << ::max<>(str1, str2) << endl; //自动推导,但指定使用模板
cout << ::max<>(97, 100) << endl; //自动推导,但指定使用模板
cout << ::max<int>(97, 100) << endl; //显示指定模板函数,使用模板函数
return 0;
}