C++_enhance-Record01—泛型编程的语法基础及使用

目录

为什么要有函数模板

泛型编程的语法

怎样定义泛型函数

怎样调用泛型函数

显式类型的调用(常用)

自动类型的推导(不常用,了解就行)

经验之谈

总体代码


为什么要有函数模板

首先,看个例子,需要实现如下的需求:写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 ;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值