一. 函数模板基本语法
#include <iostream>
using namespace std;
template<class T>
void MySwap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
//注意对于一个template而言,只能将其用于,紧贴它的那一个函数,二对于后面的,都是无效的。必须紧贴再定义其他的
template<class T1>
void MySwap1(T1& a, T1& b)
{
T1 temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 10;
int b = 20;
//1 自动类型推导
cout<<"a: "<<a<<" b: "<<b<<endl;
MySwap(a,b);//编译器根据你传的值,进行类型自动推导
cout<<"a: "<<a<<" b: "<<b<<endl;
double da = 1.23;
double db = 3.21;
cout<<"da: "<<da<<" db: "<<db<<endl;
MySwap(da,db);//编译器根据你传的值,进行类型自动推导
cout<<"da: "<<da<<" db: "<<db<<endl;
int c = 40;
int d = 80;
cout<<"c:"<<c<<" d:"<<d<<endl;
//2. 显式的指定类型
MySwap<int>(c,d);
cout<<"c:"<<c<<" d:"<<d<<endl;
}
int main()
{
test01();
return 0;
}
二. 函数模板和普通函数的区别,函数模板调用规则
#include <iostream>
//函数模板可以像普通函数那样,可以被重载
//C++编译器优先考虑普通函数
//如果函数模板可以产生一个更好的匹配,那么选择模板
//可以通过空模板实参列表的语法,限定编译器只能通过模板匹配。
using namespace std;
template<class T>
T MyAdd(T a, T b){
cout<<"template MyAdd runs"<<endl;
return a+b;
}
int MyAdd(int a, char c){
cout<<"general MyAdd runs"<<endl;
return a+c;
}
template<class T>//函数模板可以像普通函数那样,可以被重载
void Print(T a){
cout<<"Print(T a)..."<<endl;
}
template<class T>
void Print(T a, T b){
cout<<"Print(T a, T b)..."<<endl;
}
template<class T>
T MyMinus(T a, T b){
cout<<"template MyMinus(T a, T b) runs"<<endl;
return a-b;
}
int MyMinus(int a, int c){
cout<<"general MyMinus runs"<<endl;
return a-c;
}
template<class T>
T MyMultiply(T a, T b){
cout<<"template MyMultiply(T a, T b) runs"<<endl;
return a-b;
}
int MyMultiply(int a, float c){
cout<<"general MyMultiply runs"<<endl;
return a*c;
}
void test1(){
int a = 10;
int b = 20;
char c1 = 'a';
char c2 = 'b';
MyAdd(a,c1); //结果是general MyAdd runs, 因为和普通函数能够直接完全对应
MyAdd(a,b);//结果是template MyAdd runs
MyAdd(c1,b);//结果是general MyAdd runs,because普通函数能够自动进行类型转化,而函数模板必须严格类型匹配
}
int main()
{
//函数模板不允许自动类型转换
//普通函数能够自动进行类型转化
int x = 2;
int y = 1;
Print(x);
Print(x,y);
//test1();
cout<<"--------------------"<<endl;
//general MyMinus runs...C++编译器优先考虑普通函数
cout<<MyMinus(x,y)<<endl;
cout<<"--------------------"<<endl;
//template MyMultiply(T a, T b) runs. 如果函数模板可以产生一个更好的匹配,那么选择模板
cout<<MyMultiply(x,y)<<endl;
cout<<"--------------------"<<endl;
//template MyMinus(T a, T b) runs.可以通过空模板实参列表的语法,限定编译器只能通过模板匹配。
cout<<MyMinus<>(x,y)<<endl;
return 0;
}
三. c编译过程概述
四. 编译过程测试(略)