C++系列-泛型编程概念及函数模板


白云泉
唐代:白居易
天平山上白云泉,云自无心水自闲。
何必奔冲山下去,更添波浪向人间。


泛型编程的引入

想要比较两个整形数据的大小,写一个形参数是整形的函数。想要比较两个浮点型数据的大小,写一个形参是浮点型的函数。想要比较两个字符的ascii码的大小,写一个形参是char的函数。实际上几个函数的代码都差不多,那你觉得啰里八嗦写了一堆代码,烦不烦?
所以,如果可以把数据类型也作为一种可以灵活传递的参数,就太人性了。这种编程就是泛型编程了。

泛型,广泛的类型,指的仍是一种数据类型,它是一种通用类型,它可以代替其它多种类型,这个方法可以大规模的减少程序代码的编写量和重复性。泛型编程利用的主要技术是模板。

模板

C++中有两种模板机制:函数模板,类模板

函数模板

  • 函数的返回类型和形参的类型可以不具体指定,用代号T来表示,T称为泛型(generic type)。使用这种类型占位符的编程方式就叫泛型编程。
  • 在函数调用的时候再去确认T的实际类型。
  • 语法: template, 在有了这个声明后,其下紧跟的函数就是一个函数模板。template:声明创建模板,typename:表明其后的符号代表一种数据类型,也可以用class代替。后面可以有多个typename。T:通用数据类型,也可以用其它符号代替。
  • 函数模板的两种实现方式
    – 自动类型转换
    – 显式指定类型,推荐。
code:
# include <iostream>
using namespace std;

template <typename T>	// 声明一个模板,告诉编译器后面代码中紧跟着的T是一个通用数据模型	
T max_2(T a, T b)		// T是抽象的一个类型,在使用的时候再确定具体类型
{
   
   
	T result = a > b ? a : b;
	cout << "the max value: " << result << endl;
	return result;
}

template <typename T>	// 声明一个模板,告诉编译器后面代码中紧跟着的T是一个通用数据模型
void swap_2(T &a, T &b)	// T是抽象的一个类型,在使用的时候再确定具体类型
{
   
   
	T temp = a;
	a = b;
	b = temp;
}

int main()
{
   
   
	max_2(8, 5);
	max_2(8.6, 9.5);
	int a = 666;
	int	b = 888;
	cout << "原始的a: " << a << ", 原始的b: " << b << endl;
	swap_2(a, b);		// 模板实现的方式是自动类型转换
	cout << "交换后的a: " << a << ", 交换后的b: " << b << endl;
	
	float c = 666.666;
	float d = 888.888;
	cout << "原始的c: " << c << ", 原始的d: " << d << endl;
	swap_2<float>(c, d);		// 模板实现的方式是显式指定类型
	cout << "交换后的c: " << c << ", 交换后的d: " << d << endl;
	system("pause");
	return 0;
}

result:
the max value: 8
the max value: 9.5
原始的a: 666, 原始的b: 888
交换后的a: 666, 交换后的b: 888
原始的c: 666.666, 原始的d: 888.888
交换后的c: 888.888, 交换后的d: 666.666

函数模板注意事项

  • 如果使用自动类型推导,如果只使用类型T,则必须要能推导出一致的数据类型T。
  • T必须要有确定的类型,可以使用显示指示类型方式直接指定。
code:
#include <iostream>
using namespace std;

template <typename T>
void swap_1(T& a, T& b)	// T是抽象的一个类型,在使用的时候再确定具体类型
{
   
   
	T temp = a;
	a = b;
	b = temp;
}

template <typename T>
void print_info()
{
   
   
	cout 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值