函数模板
模板的意义:对类型也参数化
int sum1(int a,int b){return a+b;}
double sum2(double a ,double b){return a+b;}
几个概念
函数模板
模板的实例化
模板函数
模板类型参数
模板非类型参数
模板实参推演
模板的特例化
模板函数,模板的特例化,非模板函数的重载关系
点击查看代码
template<typename T,typename E> //定义一个模板参数列表 或者用 class T 也可以
bool compare(T x ){ //compare 是一个函数模板,它目前只是个模板
cout<<"Template Compare"<<endl;
return x>y;
}
int main(){
//函数的调用点,在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来
// bool compare<int>(int a,int b){return a>b;} 这个从模板实例化出来的函数 就叫模板函数
// bool compare<double>(double a, double b){return a>b} 这个从模板实例化出来的函数 就叫模板函数
//模板函数是编译器根据指定的类型从模板实例化出来 参与编译的函数
//从用户的角度来看,我们只写了一份模板代码,代码量是变少了,但是对于编译器来说,需要编译的代码没有减少,都需要根据指定的类型实例化出来具体函数
compare<int>(1,2);//
compare(100,200);//也可以,编译器会根据实参类型进行推演出 compare<int> 进行模板的实例化.
//注意如果有compare<int>(1,2); 然后有compare(100,200);
//编译器不会生成两套同样的 bool compare<int>(int a,int b){return a>b;},因为这个函数是需要在编译期间生成符号表,
//如果生成两次,会出现在符号表中重名问题
return 1;
}
示例代码2 不实例话模板 并查看编译后.o文件中的 符号表情况
点击查看代码
#include <iostream>
using namespace std;
template<typename T>
bool compare(T x,T y){
return x,y;
}
int main(){
return 1;
}
//编译后查看.o文件中的符号表信息如下 符号表中看不到compare函数的符号
kl@kl-ThinkPad-T580:/data/usershare/code/compile$ objdump -t test1.o
test1.o: 文件格式 elf64-x86-64
SYMBOL TABLE:
0000000000000318 l d .interp 0000000000000000 .interp
0000000000000338 l d .note.gnu.property 0000000000000000 .note.gnu.property
0000000000000358 l d .note.gnu.build-id 0000000000000000 .note.gnu.build-id
000000000000037c l d .note.ABI-tag 0000000000000000 .note.ABI-tag
00000000000003a0 l d .gnu.hash 0000000000000000 .gnu.hash
00000000000003c8 l d .dynsym 0000000000000000 .dynsym
00000000000004a0 l d .dynstr 0000000000000000 .dynstr
0000000000000576 l d .gnu.version 0000000000000000 .gnu.version
0000000000000588 l d .gnu.version_r 0000000000000000 .gnu.version_r
00000000000005c8 l d .rela.dyn 0000000000000000 .rela.dyn
00000000000006b8 l d .rela.plt 0000000000000000 .rela.plt
0000000000001000 l d .init 0000000000000000 .init
0000000000001020 l d .plt 0000000000000000 .plt
0000000000001050 l d .plt.got 0000000000000000 .plt.got
0000000000001060 l d .plt.sec 0000000000000000 .plt.sec
0000000000001080 l d .text 0000000000000000 .text
0000000000001258 l d .fini 0000000000000000 .fini
0000000000002000 l d .rodata 0000000000000000 .rodata
0000000000002008 l d .eh_frame_hdr 0000000000000000 .eh_frame_hdr
0000000000002060 l d .eh_frame 0000000000000000 .eh_frame
0000000000003d90 l d .init_array 0000000000000000 .init_array
0000000000003da0 l d .fini_array 0000000000000000 .fini_array
0000000000003da8 l d .dynamic 0000000000000000 .dynamic
0000000000003fa8 l d .got 0000000000000000 .got
0000000000004000 l d .data 0000000000000000 .data
0000000000004010 l d .bss 0000000000000000 .bss
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
00000000000010b0 l F .text 0000000000000000 deregister_tm_clones
00000000000010e0 l F .text 0000000000000000 register_tm_clones
0000000000001120 l F .text 0000000000000000 __do_global_dtors_aux
0000000000004010 l O .bss 0000000000000001 completed.8059
0000000000003da0 l O .fini_array 0000000000000000 __do_global_dtors_aux_fi