update
This commit is contained in:
36
practical_exercises/10_day_practice/day8/函数模板/例1.cpp
Normal file
36
practical_exercises/10_day_practice/day8/函数模板/例1.cpp
Normal file
@@ -0,0 +1,36 @@
|
||||
//函数模板参数可以是类属参数,也可以包括普通类型的参数
|
||||
#include<iostream>
|
||||
using namespace std;
|
||||
|
||||
|
||||
template <class T>
|
||||
//实现降序
|
||||
void sort(T &a, int n){
|
||||
for (int i=0;i<n;i++){
|
||||
int p=i;
|
||||
for (int j=i;j<n;j++)
|
||||
if(a[p]<a[j])
|
||||
p=j;
|
||||
int t=a[i];
|
||||
a[i]=a[p];
|
||||
a[p]=t;
|
||||
}
|
||||
}
|
||||
template <class T>
|
||||
void display(T& a,int n) {
|
||||
for(int i=0;i<n;i++)
|
||||
cout<<a[i]<<"\t"<<endl;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
int a[]={1,41,2,5,8,21,23};
|
||||
char b[]={'a','x','y','e','q','g','o','u'};
|
||||
sort(a,7);
|
||||
sort(b,8);
|
||||
display(a,7);
|
||||
display(b,8);
|
||||
system("pause");
|
||||
return 0;
|
||||
}
|
||||
26
practical_exercises/10_day_practice/day8/函数模板/模板特化.cpp
Normal file
26
practical_exercises/10_day_practice/day8/函数模板/模板特化.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
//Eg9-6.cpp
|
||||
#include <iostream>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
template <class T>
|
||||
T Max(T a,T b) {
|
||||
return (a>b)?a:b;
|
||||
}
|
||||
//特化
|
||||
//template <> 返回类型 函数名<特化的数据类型>(参数表) {}
|
||||
template<>char * Max<char *>(char *a,char *b) {
|
||||
return (strcmp(a,b)>=0)?a:b;
|
||||
}
|
||||
int main(){
|
||||
float c=5.1,d=3.2;
|
||||
cout<<"2,3的最大值是:"<<Max(3,2)<<endl;
|
||||
cout<<"c,d的最大值是:"<<Max(c,d)<<endl;
|
||||
cout<<Max("xbv","xyce")<<endl;
|
||||
system("pause");
|
||||
}
|
||||
/*
|
||||
① 当程序中同时存在模板和它的特化时,特化将被优先调用;
|
||||
② 在同一个程序中,除了函数模板和它的特化外,还可以有同名的普通函数。其区别在于C++会对普通函数的调用实参进行隐式的类型转换,
|
||||
但不会对模板函数及特化函数的参数进行任何形式的类型转换。
|
||||
|
||||
*/
|
||||
21
practical_exercises/10_day_practice/day8/函数模板/求最大值.cpp
Normal file
21
practical_exercises/10_day_practice/day8/函数模板/求最大值.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
//Eg9-2.cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
template <class T>
|
||||
T Max(T a,T b) {
|
||||
return (a>b)?a:b;
|
||||
}
|
||||
/*
|
||||
C++在实例化函数模板的过程中,只是简单地将模板参数替换成调用实参的类型,并以此生成模板函数,不会进行参数类型的任何转换。
|
||||
*/
|
||||
int main(){
|
||||
double a=2,b=3.4;
|
||||
float c=5.1,d=3.2;
|
||||
//在模板调用时进行参数类型的强制转换
|
||||
cout<<"2, 3.2 的最大值是:"<<Max(double(2),3.2)<<endl;
|
||||
cout<<"a, c 的最大值是:"<<Max(float(a),c)<<endl;
|
||||
//显示指定函数模板实例化的参数类型
|
||||
cout<<"'a', 3 的最大值是:"<<Max<int>('a',3)<<endl;
|
||||
system("pause");
|
||||
}
|
||||
|
||||
43
practical_exercises/10_day_practice/day8/函数模板/重要.cpp
Normal file
43
practical_exercises/10_day_practice/day8/函数模板/重要.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
//Eg9-1.cpp
|
||||
#include <iostream>
|
||||
//注意一点,max与min使用的时候,容易引起冲突,如果写了下面这一行代码,则要改变函数模板名字,否则直接使用std::cout与std::endl
|
||||
using namespace std;
|
||||
/*
|
||||
不要把这里的class与类的声明关键字class混淆在一起,虽然它们由相同的字母组成,但含义是不同的。
|
||||
这里的class表示T是一个类型参数,可以是任何数据类型,如int、float、char等,或者用户定义的struct、enum或class等自定义数据类型。
|
||||
*/
|
||||
template <class T>
|
||||
T Min(T a,T b) {
|
||||
return (a<b)?a:b;
|
||||
}
|
||||
/*
|
||||
为了区别类与模板参数中的类型关键字class,标准C++提出?了用typename作为模板参数的类型关键字,同时也支持使用class。
|
||||
比如,把min定义的template <class T>写成下面的形式是完全等价的:
|
||||
*/
|
||||
template <typename T>
|
||||
T myMin(T a, T b){
|
||||
return (a<b)?a:b;
|
||||
}
|
||||
|
||||
/*
|
||||
模板实例化发生在调用模板函数时。当编译器遇到程序中对函数模板的调用时,
|
||||
它才会根据调用语句中实参的具体类型,确定模板参数的数据类型,
|
||||
并用此类型替换函数模板中的模板参数,生成能够处理该类型的函数代码,即模板函数。
|
||||
当多次发生类型相同的参数调用时,只在第1次进行实例化。编译器只在第1次调用时生成模板函数,
|
||||
当之后遇到相同类型的参数调用时,不再生成其他模板函数,它将调用第1次实例化生成的模板函数。
|
||||
*/
|
||||
int main(){
|
||||
double a=2,b=3.4;
|
||||
float c=2.3,d=3.2;
|
||||
cout<<"2,3 的最小值是:"<<Min<int>(2,3)<<endl; //显式调用
|
||||
cout<<"2,3.4 的最小值是:"<<Min(a,b)<<endl;//隐式调用
|
||||
cout<<"'a','b' 的最小值是:"<<Min('a','b')<<endl;
|
||||
cout<<"2.3,3.2的最小值是:"<<Min(c,d)<<endl;
|
||||
cout<<"2.3,3.2的最大值是:"<<std::min(c,d)<<endl;//引用命名空间内部的最小值函数
|
||||
cout<<"2.3,3.2的最小值是:"<<myMin(c,d)<<endl;//更换class为typename
|
||||
// cout<<"2,'a' 的最小值是:"<<Min(2,'a')<<endl; //报错,不同类型无法处理,请看9-3-1.cpp
|
||||
system("pause");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user