目录
为什么要有函数模板
首先,看个例子,需要实现如下的需求:写n个函数,交换char类型、int类型、double类型变量的值。那么我们就需要写三个函数,来实现这些需求。就这样写:
void myswap01(int &a, int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
void main11()
{
int x = 10;
int y = 20;
myswap01(x, y);
printf("x:%d y:%d \n", x, y);
cout<<"hello..."<<endl;
system("pause");
return ;
}
那么,同样的道理,那需求者可能还会让你再实现一遍业务逻辑,比如说让你再实现一个"char"类型的,
void myswap01(int &a, int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
void myswap02(char &a, char &b)
{
char c = 0;
c = a;
a = b;
b = c;
}
void main11()
{
{
int x = 10;
int y = 20;
myswap01(x, y);
printf("x:%d y:%d \n", x, y);
}
{
char a = 'a';
char b = 'b';
myswap02(a, b);
printf("a:%c b:%c \n", a, b);
}
cout<<"hello..."<<endl;
system("pause");
return ;
}
运行如下:
可以发现,做这种工作,函数的业务逻辑是非常类似的!只不过就是函数的类型、参数不一样而已。这是低效的。那么有没有一种机制,可以让我们程序员让函数的参数类型参数化,进而方便程序员进行编程呢?这就是模板机制,这就是泛型编程!
泛型编程的语法
函数模板定义形式
template < 类型形式参数表 >
假设有多个类型,就有逗号隔开,"typename"和"class"这俩关键字是等效的,类型形式参数的形式为:
typename T1 , typename T2 , …… , typename Tn
或 class T1 , class T2 , …… , class Tn
怎样定义泛型函数
那么下面,用demo来说明,写一个能处理"int"类型和"char"类型的这样一个泛型编程模板:
template <typename T>
void myswap(T &a, T &b)
{
T c = 0;
c = a;
a = b;
b = c;
cout << "hello ....我是模板函数 欢迎 calll 我" << endl;
}
其中"template <typename T>"相当于告诉C++编译器:"我要开始泛型编程了,看到T,不要随便报错"。关键字"T"代表数据类型来定义变量。以上就定义了一个泛型函数,可以同时替代最开始的"char"和"int"的类型的那两个函数。
怎样调用泛型函数
函数模板的调用有两个机制,一个是显式类型调用,另一个是自动类型推导。
显式类型的调用(常用)
调用程序如下:
void main()
{
int x = 10;
int y = 20;
myswap<int>(x, y); //1 函数模板 显示类型 调用
printf("x:%d y:%d \n", x, y);
}
其中"myswap<int>(x, y)","<>"内填入的是要实现的数据类型,"()"内填入的是要输入的变量。
void main()
{
char a = 'a';
char b = 'b';
myswap<char>(a, b); //1 函数模板 显示类型 调用
printf("a:%c b:%c \n", a, b);
}
自动类型的推导(不常用,了解就行)
针对调用"int"类型的自动类型推导:
void main()
{
int x = 10;
int y = 20;
myswap(x, y); //2 自动类型 推导
printf("x:%d y:%d \n", x, y);
}
针对调用"char"类型的自动类型推导:
void main()
{
char a = 'a';
char b = 'b';
myswap(a, b);
printf("a:%c b:%c \n", a, b);
}
可以看成,自动推导就是不用指定具体的数据类型,直接写就可以了!
经验之谈
1.如果定义了类型形式参数,就必须用,不能不用,比如:
template <typename T, typename T1>
定义了两个类型形式参数,就必须都用上,不能不用!
2.一些编译器在进行模板编程的时候会出现问题,这与不同的编译器实现模板编译的本质,有密切的关系。
总体代码
dm01_为什么会有函数模板和基本语法.cpp
#include <iostream>
using namespace std;
// 函数的业务逻辑 一样
// 函数的参数类型 不一样
void myswap01(int &a, int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
void myswap02(char &a, char &b)
{
char c = 0;
c = a;
a = b;
b = c;
}
//让 类型参数化 ===, 方便程序员进行编码
// 泛型编程
//template 告诉C++编译器 我要开始泛型编程了 .看到T, 不要随便报错
template <typename T>
void myswap(T &a, T &b)
{
T c = 0;
c = a;
a = b;
b = c;
cout << "hello ....我是模板函数 欢迎 calll 我" << endl;
}
//函数模板的调用
// 显示类型 调用
// 自动类型 推导
void main()
{
{
int x = 10;
int y = 20;
//myswap<int>(x, y); //1 函数模板 显示类型 调用
//myswap(x, y); //2 自动类型 推导
printf("x:%d y:%d \n", x, y);
}
{
char a = 'a';
char b = 'b';
//myswap<char>(a, b); //1 函数模板 显示类型 调用
myswap(a, b);
printf("a:%c b:%c \n", a, b);
}
}
void main11()
{
{
int x = 10;
int y = 20;
myswap01(x, y);
printf("x:%d y:%d \n", x, y);
}
{
char a = 'a';
char b = 'b';
myswap02(a, b);
printf("a:%c b:%c \n", a, b);
}
cout<<"hello..."<<endl;
system("pause");
return ;
}