C++ 中的泛型——template浅析

本文出自神农班,神农班宗旨及班规:https://mp.weixin.qq.com/s/Kzi_8qNqt_OUM_xCxCDlKA

个人博客:https://blog.N0tExpectErr0r.cn

小专栏:https://xiaozhuanlan.com/N0tExpectErr0r

C++ 的模板是一个比较复杂的领域,在 C++ 中的应用十分广泛,它和 Java 中的泛型有相似之处,但本质上却有非常大的不同。出于好奇,在阿拉神农老师的指导下,写下了这篇文章,对 C++ 的模板进行一系列的学习。

在文章开始之前,各位可以先读一下阿拉神农老师对模板的一些心得体会,可能会对模板有一个更加全面的理解:

image-20190920140753464

模板的引入及意义

首先我们来思考一个问题:为什么 C++ 需要引入模板?

作为程序员,我们都具有一个非常优良的美德——懒。正是因为懒,我们才会想要去减少我们的工作量,从而发明了一系列的语言特性与工具从而降低开发的成本。C++ 相较于 C 语言最大的区别就是引入了面向对象,而面向对象的三大特性:封装、继承、多态,其实都有一个共同的目的——减少编码的成本,提高开发效率。比如我们可以通过封装来对一些重复的逻辑进行抽取,实现一些易于使用的类,来避免后期写一些重复的代码。

而引入模板,也是为了减少编码的成本。通过模板,我们可以对类型进行抽象,将一些多个类型共有的逻辑进行抽取,使得每个类型都能够适用同一套逻辑,避免了我们大量的重复代码编写。

例如,现在我们有一个将两个 int 值相加的函数 add

int add(int a, int b) {
   
	return a+b;
}

我们都知道,float 也是支持加法的,如果此时我们还需要实现一个对 float 相加的函数,就需要通过重载实现如下的函数:

float add(float a, float b) {
   
	return a+b;
}

但我们其实可以发现这两段代码除了类型不同,剩余逻辑都是基本相同的,我们完全可以通过一些手段来对这个类型进行替换,从而做到只需要一次编写,即可对不同类型的变量完成相同的工作。

说到对类型进行替换,我们首先想到的当然就是宏,通过宏我们可以实现在预编译的过程中,对一些代码中的片段进行替换。有了这样一个想法,我们可以写出如下的宏,实现对不同类型变量的 add 方法的函数声明:

#include <iostream>
#define DECLARE_ADD_FUN(type)\
type add(type a, type b) {\
    return a+b;\
}

DECLARE_ADD_FUN(int)
DECLARE_ADD_FUN(double)

int main() {
   
   	std::cout<<add(1,3)<<std::endl;
    std::cout<<add(3.14, 1.024)<<std::endl;
}

这样,我们就不再需要再重复进行函数的编写了,可以通过宏定义对指定的类型根据模板函数生成对应的函数定义。

虽然解决了代码大量编写的问题,但使用宏定义进行这些函数或类的模板开发实际上是非常不方便的,主要有以下的原因:

  1. 在编写宏定义时,编辑器并不会对宏定义中的代码进行语法的检查,只有使用宏定义时才会意识到自己的代码出现了语法错误,如果有一个极其复杂的宏则会给我们的开发带来极大的困难。
  2. 出现错误时,仅仅根据宏定义使用时所提示的错误,是很难定位到具体的错误点的。

虽然宏定义的实现方式不够优雅,但这种在编写代码时使用一些以后才会指定的类型的思想还是非常值得我们借鉴的,这种思想现在通常被称为『泛型』。

为了引入泛型思想,C++ 加入了模板这一特性,通过模板我们可以在 C++ 代码编写过程中,不关注于变量的具体类型,将一些对变量进行相似操作的逻辑抽象出来,将类型的绑定延迟到使用时进行。通过这样的设计,类型就可以像我们编写函数时的参数一样,调用时再进行指定了。

比如,前面的 add 函数,我们就可以以如下的方式进行编写:

template <typename T>
T add(T a, T b) {
   
    return a + b;
}

int main() {
   
	std::cout << add(1,3) << std<
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值