本篇解决以下几个问题:
1.什么是模板?使用模板的原因?
模板是为了解决函数在使用过程中只是数据类型发生变化,而内容未发生变化,这个时候就可以使用模板来表示多种数据类型的状况。
打个比方,同样的凉拌菜调味配方,你可以用来这个调味配方,凉拌个黄瓜,也可以凉拌个猪耳朵(可变的就是黄瓜和猪耳朵)。
2.函数模板的定义?
//模板--核心:把某些类型(int double...)的关键字看成是变量(函数重载的泛化) templateT GetMin(T a, T b) { return a > b ? a : b; }
3.函数模板隐式实例化及存在的问题?
隐式实例化:
//函数模板的隐式实例化(由编译器猜测函数模板的类型) int n=GetMin(1,1);
隐式实例化可能会导致编译器在选择匹配函数时陷入两难境界。
例如:GetMin(1,2.0f)就会让编译器不知道该找哪一个,这个时候可以采用显式实例化来指定数据类型。
4.函数模板显式实例化
//显式实例化,指明数据类型 GetMin(1, 2.0f);
5.函数模板的特例
前面的均为数值的比较,如果需要比较两个字符串该怎么做呢?
//当函数模板不够用,可以采用模板特例化的形式 //模板的特例化 template<> char* GetMin(char* a, char*b) { return a; }
//模板的特例化使用 GetMin("Hello","World");
6.学习视频地址:函数模板
7.学习笔记:
#includeusing namespace std; //模板--核心:把某些类型(int double...)的关键字看成是变量(函数重载的泛化) template T GetMin(T a, T b) { return a > b ? a : b; } //当函数模板不够用,可以采用模板特例化的形式 //模板的特例化 template<> char* GetMin (char* a, char*b) { return a; } //在内容不改变,只是变量类型有不同的时候适用模板 //int GetMin(int a, int b) //{ // return a > b? a: b; //} // //int GetMin(float a, float b) //{ // return a > b ? a : b; //} int main(int argc,char* argv[]) { //函数模板的隐式实例化(由编译器猜测函数模板的类型) int n=GetMin(1,1); //显式实例化,指明数据类型 GetMin (1, 2.0f); //模板的特例化使用 GetMin ("Hello","World"); //cout << "int GetMin(int a, int b)" << GetMin(1, 2) << endl; //cout << "int GetMin(float a, float b)" << GetMin(1.14f, 2.14f) << endl; return 0; }



