浅述C++模板——函数模板及类模板

这篇具有很好参考价值的文章主要介绍了浅述C++模板——函数模板及类模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

模板作为 C++ 的一大特色,对于泛型编程有着重要的作用。同时,对于大规模类似的函数或是类型不确定的类,模板都起了至关重要的作用。

一、模板

在开始学习模板之前,我们首先需要了解模板。先看下面一个例子:

#include <iostream>
using namespace std;

int func_one(int num){
    return 2 * num;
}

double func_two(double num){
    return 2 * num;
}

int main(){
    int num_int = 2;
    double num_double = 2;
    
    func_one(num_int);
    func_two(num_doule);
    
    return 0;
}

我们可以轻易发现,对于函数 func_one、func_two,两者实现的功能基本相同,只是所接受的参数和返回值发生了对应的变化。因此有没有一种办法可以简化这两个函数,将其合并为一个呢?答案就是使用模板。

下面的例子是对上面的两个函数使用模板的结果:

#include <iostream>
using namespace std;

template <class T>
T func(T num){
    return 2 * num;
}

int main(){
    int num_int = 2;
    double num_double = 2;
    
    func(num_int);
    func(num_doule);
    
    return 0;
}

在上面的案例中我们见到了新的关键字 template。它表示此处运用模板,后面 <> 中则表示,有一个模板类型 T,T 在此会根据我们函数的传参自动生成对应的类型。例如 num_int 传入后 T 则代表 int; num_double 传入后 T 则代表 double。

模板就像一个空的模具,大体上不会改变,但是你提供什么参数都可以按照模具的形状进行操作

二、函数模板

在上面介绍时我们使用的模板就是函数模板,除此之外还有类模板,但是我们先从函数模板开始讲起。

2.1 模板的格式

**函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。**函数模板的诞生是为了简化重复的函数,哪怕利用重载,也需要对一个函数进行多次重载,但是模板函数只需一个模板即可适应各个种类。

函数模板的格式如下:

template <class T1, typename T2, class T3, … , typename TN>

返回值类型 函数名(参数列表){

​ 函数主体;

}

声明一个模板类型的时候,可以使用 “class” 或 “typename”,两者无差别。但是需要注意的地方在于,一个模板类型只能代表一种类型。例如在上面的函数中,T1 实例化为 int 类型后就不能再代表 char 等类型,具体如下:

#include <iostream>
using namespace std;

template <class T1>
double func_one(T1 num_1, T1 num_2){
    return num_1 + num_2;
}

template <class T1, class T2>
double func_two(T1 num_1, T2 num_2){
    return num_1 + num_2;
}

int main(){
    int num_int = 2;
    double num_double = 2;
    
    func_one(num_int, num_double);
    func_two(num_doule, num_double);
    
    return 0;
}

在这个例子中,主函数中调用 func_one 是失败的,T1 在接收 num_1 时,已经实例化为 int, 但是 num_2 为 double 类型,因此发生了错误。为接收不同类型的两个参数,我们可以考虑使用 func_two。

2.2 模板的匹配优先度

先看下面的案例,猜测系统会调用哪个函数。

#include <iostream>
using namespace std;

int func(int num_1, int num_2){
    return num_1 + num_2;
}

template <class T1>
int func(T1 num_1, T1 num_2){
    return num_1 + num_2;
}

int main(){
    int num_1 = 1;
    int num_2 = 2;
    
    func(num_1, num_2);
    func<int>(num_1, num_2);
    return 0;
}

经过调试,我们可以得知:

第一次调用 func 函数,调用的是第一个非模板的 func 函数,这是由于在可以找到匹配的函数时,优先不调用模板函数,避免重复生成一个一样的函数;

第二次调用 func 函数,调用的模板生成函数,这是由于 func(), 表示我们手动要求生成一个 func 模板函数用 int 实例化之后的函数,此时会优先采用手动要求的模板函数。

2.3 模板的声明

比起其他的函数,模板函数要求必须声明和定义在一起,不可声明与定义分离。此过程涉及到编译链接的过程,不在此展开。

三、类模板

在了解了函数模板之后,类模板也非常好理解,例如我们之后会学到的 vector 容器就是一个模板类:

#include <iostream>
using namespace std;

template <class T>
class vector{
private:
    T* ptr;
public:
    vector(T num){
        // ......
    }
}

在这个类中,构造一个类时需要传入一个类型作为参数,然后 ptr 的类型就确定了,之后的函数就可以据此继续完成。之后将以 vector 为例,讲述一个模板类的实现。

四、总结

模板的优点显而易见,一方面节省了资源,便于代码的迭代更新,另一方面增加了代码的灵活性。那是不是我们要多多使用模板呢?答案是否定的。

首先模板相比于普通的函数需要的编译时间更长,且出现错误信息时不易定位错误位置。所以具体使用重载还是模板要根据实际情况来合理进行判断选取。文章来源地址https://www.toymoban.com/news/detail-699232.html

到了这里,关于浅述C++模板——函数模板及类模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++——函数模板与类模板

    C++知识合集 目录 1.泛型编程 2.函数模板 2.1函数模板实例化 2.2函数模板参数的匹配原则 3.类模板 4.模板的分离编译 实际上泛型编程的难度是比较高的,但我们泛型编程的初学者,当然要从简单的地方开始入手。 我们可以写出很多份交换函数,这些函数之间构成函数重载,这

    2024年02月08日
    浏览(33)
  • C++函数模板和类模板

    C++另一种编程思想称为泛型编程,主要利用的技术是模板 C++提供两种模板机制:函数模板和类模板 即:我们提供一个抽象的函数或类,并不具体指定其中数据的类型,而是某个虚拟类型代替。只提供基本的功能。其具体的数据类型,只在其被调用时视具体情况实例化。 举个

    2024年02月12日
    浏览(31)
  • 【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

    在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ; 函数模板 Function Template 是 C++ 语言 中的 重要特性 ; 函数模板概念 : 建立一个 \\\" 通用函数 \\\" , 不指定该函数的 函数返回值类型 和 函数参数类型 , 仅使用 \\\" 虚拟类型 \\\" 代表 上述 两种类型 , 该 \\\" 通用函数 \\\" 就是 \\\" 函数模

    2024年02月19日
    浏览(28)
  • C++从入门到精通——类的定义及类的访问限定符和封装

    类的定义是面向对象编程中的基本概念,它描述了一类具有相同属性和方法的对象的抽象模板。类定义了对象的结构和行为,包括数据成员(属性)和成员函数(方法)。通过类,可以创建多个具有相同属性和方法的对象实例,从而实现代码的复用和模块化。类的定义通常包

    2024年04月10日
    浏览(30)
  • 【C++】模板初阶——函数模板和类模板

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C++  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月10日
    浏览(31)
  • 【C++从入门到放弃】模板介绍(函数模板、类模板)

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   以我们之前所学的知识,假如要实现一个通用的加法函数,那么可以通过函数重载的方式来实现。 使用函数重载虽

    2023年04月14日
    浏览(31)
  • C++基础(10)——函数模板和类模板

    本文主要介绍了C++中函数模板和类模板基本知识 模板函数的定义 templatetypename T+函数的定义或声明 模板函数的两种使用方法(编译器自动推测、显示指定T的类型) 注意事项: 模板一定要确定指出T的数据类型才可以使用;T由编译器自动推导出来,如果类型不一致也不可以使

    2024年02月09日
    浏览(28)
  • learn C++ NO.8——初识模板(函数模板、类模板)

    现在是北京时间2023年6月5号13.31分,距离上一篇博客发布已过一周。期间还零零散散进行了一些期末考试,这也说明了我的大一时光快要结束了。我也想抓着期末的尾巴,好好的复习一下前面的所学内容,争取这周能够更一下简单数据结构的博客。 泛型编程是一种编程范式,

    2024年02月07日
    浏览(34)
  • 【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】七、内存管理 (C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表

    2024年02月04日
    浏览(32)
  • c++模板编程2-函数模板的定义和使用

    两阶段编译检查 在实例化模板的时候,如果模板的参数类型不支持模板中用到的操作符,将会遇到编译期错误,例: 以上例子 add(a, b) 会在编译器报错,但在模板定义的地方并没有出现错误提示,这是因为模板是分两步编译的: 在模板定义阶段,模板的检查并不包含类型参

    2024年02月06日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包