一. 函数模板基本语法
#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编译过程概述
四. 编译过程测试(略)