【C++】模板和泛型编程

1、模板

不用为每个类型定义一个新函数,而是只定义一个函数模板。函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。

举例如下:

我们想要编写一个函数比较两个值,并指出第一个值是大于,小于还是等于第二个值。第一次尝试是定义几个重载函数。

int compare(const string &v1, const string &v2) {
	if (v1 < v2)
		return -1;
	if (v1 > v2)
		return 1;
	return 0;
}

int compare(const double &v1, const double &v2) {
	if (v1 < v2)
		return -1;
	if (v1 > v2)
		return 1;
	return 0;
}

//这两个函数唯一的区别是形参类型不同,每个待比较的类型都需要重复函数的函数体,麻烦且易出错。
//更重要的是需要事先知道究竟可能会比较哪些类型。
//如果希望将函数用于未知类型,这种策略就不起作用了。

下面是compare的模板版本:

//声明了一个名为T的类型形参
//在compare内部,可以使用名字T引用一个类型,T表示哪个实际类型由编译器根据所用的函数而确定
template<typename T>
int compare(const T &v1, const T &v2) {
	if (v1 < v2)
		return -1;
	if (v1 > v2)
		return 1;
	return 0;
}

模板定义以关键字template开始,后接模板形参表(不能为空),模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。

模板形参表类似函数形参表,函数形参表定义了特定类型的局部变量但并不初始化那些变量,运行时再提供实参来初始化形参。

模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。非类型形参跟在类型说明符之后声明。类型形参跟在关键字class或typename之后定义。

使用函数模板时,编译器会推断哪个(哪些)模板实参绑定到模板形参。一旦编译器确定了实际的模板实参,就称它实例化了函数模板的一个实例。

2、泛型编程

定义:以独立于任何特定类型的方式编写代码。

使用泛型程序时,我们需要提供具体程序实例所操作的类型或值。模板是泛型编程的基础。

泛型编程与面向对象编程一样,都依赖于某种形式的多态性。面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性。

 

参考:C++ primer 中文版 第四版 p526

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值