//函数模板的定义语法---------------------------------------
template <typename T1, typename T2, ... typename Tn>
//或者 template <class T1, class T2, ... class Tn>
返回值类型 函数名 (形式参数表)
{
语句块
}
//------------------------------------------------------------------
//函数模板定义eg:
//template 的意思是告诉c++编译器我要进行泛型编程了,不要看到T随便报错
template <typename T> //template<class T>
void myswap(T&a, T&b)
{
T temp = a;
a = b;
b = temp;
}
//函数模板的调用形式
//1 . 显示类型调用
//2. 自动类型推导
//eg:
int main()
{
int x = 10;
int y = 20;
myswap<int>(x, y);//显示类型调用
char a = 'c';
char b = 'd';
myswap(a, b);//自动类型推导
return 0;
}
//------------------------------------函数模板和普通函数 的重载------------------
template <typename T> //template<class T>
void myswap(T&a, T&b)
{
T temp = a;
a = b;
b = temp;
}
void myswap(int a, char b)
{
T temp = a;
a = b;
b = temp;
}
void myswap(char a, char b)
{
T temp = a;
a = b;
b = temp;
}
int maini()
{
int a = 0;
char c = '1';
double u = 1.0;
myswap(a, c);//void myswap(int a, char b)
myswap(c, a);//void myswap(int a, char b)---普通函数存在类型的隐式转换
myswap(a, a);//void myswap(T&a, T&b) --函数模板“严格”按照类型匹配
myswap(c, c);//void myswap(char a, char b) --当普通函数和函数模板都符合调用时,编译器优先选择普通函数
myswap<>(c, c);//void myswap(T&a, T&b)--若要强制选择函数模板,添加参数化列表,即空的<>
myswap(u, u);//void myswap(T&a, T&b)--如果函数模板能产生更好的匹配,则选择函数
//函数模板和普通函数之间可以实现重载
return ;
}
//------------------------函数模板机制--------------------
-E 预处理 (包括宏展开) 生成 .i 文件
-S 编译 生成 .s 汇编程序文件
-c 生成可重定位二进制目标程序 .o
通过链接器把.o文件 等压制成可执行程序exe
//编译源码成汇编
g++ -S xxx.cpp -o xxx.s
c++编译器进行两次编译,第一次编译在声明的地方对函数模板进行语法分析、语法分析、句法分析,生成一个简陋的函数原型,第二次编译时根据调用的函数参数类型生成新的具体的函数原型,和普通函数放在一起的,所以能重载。