C++ 模板与泛型编程简述

本文探讨了模板和泛型编程的概念,通过函数模板实例展示了如何创建一个通用的比较函数,以及模板的使用方式和编译过程。深入理解了如何利用模板实现代码复用,提高编程效率。

目录

1、什么是模板和泛型编程

2、定义及使用模板


1、什么是模板和泛型编程

什么是模板?什么是泛型编程?模板的概念与泛型编程是相辅相成的。想象一个场景:我们需要比较两个整数或两个字符串的大小,假如你还不知道模板的概念,那大可能会写出两个类似的函数来解决这个问题,就像下面这样:

// 对比两个整数的大小
int compare_int(int v1, int v2) { 
    if(v1 < v2)  return -1; 
    else if(v1 > v2) return 1; 
    else return 0;
}
// 对比两个字符串的大小(按字典序比较)
int compare_str(string s1, string s2) { 
    if(v1 < v2)  return -1; 
    else if(v1 > v2) return 1; 
    else return 0;
}

仔细品味这两个函数,其实两者现原理一摸一样,既然能用同样的方法实现,为何还要写两个函数呢?有没有通用的方法是用一个函数来解决呢?有的有的,函数模板就是干这种活儿的,干这活的过程就是泛型编程,这里“泛型”的意思就是“通用”的意思。除了函数模板外,还有类模板等。

2、定义及使用模板

以函数模板为例,上一节问题写成模板的形式就是下面这样:

template <typename T>
int compare(const T &v1, const T &v2){ 
    if(v1 < v2)  return -1; 
    else if(v1 > v2) return 1; 
    else return 0;
}

模板定义以关键字 template 开头,后跟一个模板参数列表,这是一个逗号分隔开的一个或多个模板参数。在模板定义过程中我们将模板参数 T (习惯用T,也可以用其他任意合法名字表示)当作替身,代替使用模板时用户提供的类型或值。

模板类型参数可以使用关键字 class 或 typename ,在模板参数列表中这两个关键字含义相同,可以互换调用,一个模板参数列表中可以同时使用这两个关键字。(为什么有两个呢?typename 是后来引入的,看起来会比 class 直观些)

template <typename T, class U> calc(const T&, const U&);

模板的实例化及编译过程解释:

如上述 compare 函数模板,我们用 T 表示一个类型,在编译时编译器会根据函数具体的实参来自动推断模板实参类型。

另外在编译过程中,为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此与非模板代码不同,函数模板和类模板成员函数的定义通常放在头文件中。(非模板函数一般是把声明放在头文件中,具体的定义放在源文件中)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球被支点撬走啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值