定义
标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
简单来说就是将类型参数化,实现算法与类型的分离,编写针对类型更加抽象的函数和类
语法格式:
template //template<类型形式参数表> 泛型参数
void func(T t){
}
template<类型形式参数表> 类型参数列表可以有多个类型
template<typename T1,typename T2,…>
template 关键字
typename 关键字 ------ class
函数模板中的类型参数一般用于函数的形参列表,但也可以用于函数体中定义变量
函数模板中的类型参数一般作用于形参,那么如果在调用该函数时,
可以根据实参的类型进行类型推导,从而不需要指定模板类型
注意,有的时候根据实参也不能推导出来,必须显示提供类型参数
如果函数模板类型作用于函数体中,在调用函数时只能显示传递类型进行实例化
所谓的函数模板其实好比一个类型,需要用具体的类型来实例化成函数(模板函数)
函数模板 用具体的类型实例化 模板函数
STL库和C++标准库关系:
STL 体系结构
C++为什么能够支持模板这种语法?
C++支持重载
函数模板根据类型实例化之后,生成了函数名相同,参数列表不同的重载函数
调用函数模板: 函数模板要先根据类型实例化 产生具体的 模板函数
实际上调用的是 模板函数
函数模板: 是模板 类 需要实例化对象 这个对象 称为 模板函数
模板函数: 是函数 可以调用
函数名(实参列表); //类型推导
函数名<类型参数>(实参列表); //不能进行类型推导
#include <iostream>
#include <typeinfo>
using namespace std;
//函数模板
template<typename T>
void func(T t){
cout << typeid(T).name() << endl;
}
/*
func<int>(3) 把函数模板实例化产生 void func(int t){} 模板函数
void func(char t){}
void func(double t){}
*/
class A{
};
template<typename T,typename F>
void func(T t,F f){
cout << typeid(T).name() << " " << typeid(F).name() << endl;
}
template<class T1,class T2,class T3>
void func(T1 t1,T2 t2,T3 t3){
}
template<typename T>
void bar(){
T t;
cout << typeid(t).name() << endl;
}
int main(){
func<int>(3);
func<double>(3.14);
func<float>(3.14);
func<char>(3);
func<A>(A());
func(3);//可以根据实参进行类型推导
func(A());
func(3.14);
bar<int>();//必须传递类型参数 不能进行类型推导
return 0;
}