C++ 笔记(五):泛型编程和 STL
模板
函数模板
建立通用函数,返回值类型和形参类型可以不具体指定,用一个虚拟的类型代表,即类型参数化
语法
1
2template<typename T>
ret-type func-name(parameter list)- T 一个符号,通常使用大写字母,代表通用数据类型
示例
定义
1
2
3
4template<typename T>
T myAdd(T a, T b){
return a + b;
}调用
1
2myAdd<int>(0, 1); // 显式类型指定
myAdd(1, 2); // 自动类型推导
注意事项
必须能够推导出数据类型
1
2
3
4
5
6template<typename T>
void func(){
cout<<"func函数调用"<<endl;
}
func(); // 错误必须推导出一致的数据类型
1
2int a(10);char c('c');
myAdd(a,c); // 错误
普通函数与函数模板的区别:
普通函数调用时可以发生隐式类型转换
函数模板调用时,如果是自动类型推导,则不会发生隐式类型转换
如果是显式类型指定,则可以发生隐式类型转换
普通函数与函数模板的调用规则:
如果普通函数与函数模板都可以实现,优先调用普通函数
但是可以通过空模板参数列表来强制调用函数模板
如果函数模板可以产生更好的匹配,优先调用函数模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19void foo(int a,int b){
cout<< "调用普通函数" <<endl;
}
template<typename T>
void foo(T a,T b){
cout<< "调用模板" <<endl;
}
int main() {
int a(10), b(20);
foo(a,b); //调用普通函数
foo<>(a,b); //调用模板--空参数列表
foo<int>(a,b); //调用模板
char c('c'),d('d');
foo(c,d); //调用模板--更好的匹配
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 孤舟のBlog!
评论