EasyC++函数模板介绍

文章转自: 公众号:Coder梁(ID:Coder_LT)

函数模板:

所谓函数的模板,本质上也就是使用泛型来定义函数。

所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,可以定义存储int型的vector也可以定义存储float类型的,也可以定义存储其他类型。我们在声明的时候将存储的类型当做参数传给了模板。

泛型可以用具体的类型,比如(int或double)替换,通过将类型作为参数传给模板,编译器会根据传递的参数类型生成该类型的函数。这种方式也被称为通用编程或者参数化类型。

举一个很简单的例子,比如说我们要实现一个函数交换两个变量的值。对于int类型我们要实现一遍,对于double类型我们又要实现一遍,如果还需要其他类型,那么又需要额外实现很多同样逻辑的函数。当然可以拷贝代码,但显然这样会很浪费时间,而且会使得代码变得臃肿。

这个时候我们就可以使用函数模板自动完成这一功能,函数模板允许以任意类型来定义函数,所以我们就可以这样实现:

template <typename T>
void swap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

当我们要创建一个模板的时候,需要首先声明模板的类型,也就是template语句做的事情。关键字typename也是必须的,也可以使用class代替。typename关键字是在C++98标准添加的,所以在更早的版本中往往使用class。在这个场景下,这两种方式是等价的。C++ Primer当中更建议使用typename而非class。

typename之后跟的是类型的名称,我们可以使用任意的名字,一般来说习惯性地会使用字母T。我们在使用的时候和普通函数并没有什么不同,当做普通函数使用即可。

template <typename T>
void swap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

int i = 10, j = 20;
swap(i, j);
double a = 3.0, b = 4.0;
swap(a, b);

虽然我们只实现了一次函数,但是在编译的时候,编译器会将这个函数根据我们使用的情况生成多个版本。比如在上面的代码当中,我们使用了int和double两种类型的函数。编译器会替我们生成两份代码,也就是说最终代码上和我们手动实现函数重载是一样的,可以理解成一种方便我们程序编写的特性。

到此这篇关于C++函数模板介绍的文章就介绍到这了,更多相关C++函数模板内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++函数模板的使用详解

    函数模板可以适用泛型来定义函数,其中泛型可以是(int, double, float)等替换.在函数重载过程中,通过将类型作为参数传递给模板,可使编译器自动产生该类型的函数. 工作原理:比如需要定义一个比大小的max函数,有三种类型的数据(int,double,float),可能就需要编写三个函数,这样既浪费时间,且容易出错.如: #include <iostream> using namespace std; int Max(int a, int b); double Max(double

  • C++中类模板的应用你了解多少

    目录 类模板应用 数组类的封装 Int的.hpp文件 int的测试文件 Person类的.hpp文件 Person类的测试文件 总结 类模板应用 数组类的封装 属性: 1,T *pAddress 指向堆区数组的指针. 2,int m_Capacity 数组容量 3,int m_Size 数组大小 行为: 1,myArray(int capacity) 构造函数 2,myArray(const MyArray&arr) 拷贝构造函数 3,operator= 重载赋值操作符= 4,operator[

  • 基于C++泛型编程职工管理系统

    目录 一.泛型编程思想 二.单链表是什么? 1.图示 2.链表的节点结构[节点类] 3.链表类 三.泛型编程核心 1.实现数据类 2.实现链表类 四.运行截图 1.主菜单 2.查看信息 3.更换数据类型 4.再次显示所有信息[抛转] 五.源码 前言: 前面介绍到了C++的泛型编程,并实现了万能容器,不过那使用的是数组,今天呢咱带大家实践一下使用泛型技术,结合单链表实现一个职工管理系统.保证大家看完之后有所感悟. 一.泛型编程思想 所谓泛型就是类型不固定,只需修改少量代码就可以扩展为其他类型的应用

  • C++泛型编程Generic Programming的使用

    目录 一.容器 array vector deque list map 键值对key/value 二.迭代器iterator(泛型指针) 三.泛型算法Generic Programming insert()插入 erase()删除 find()用于无序搜索,搜素范围[first, last), 返回iterator, 找不到则返回last copy() 复制 泛型编程最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库. 所谓通用的标准容器库,就是要能够做到,比如用一个

  • C++ 函数模板和类模板详情

    目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1. 泛型编程 如何实现一个通用的交换函数? 在C++中可以用到函数重载 class A { public: void Swap(int& x1,int& x2) { int temp=x1; x1=x2; x2=temp; } void Swap(double&

  • C++泛型编程函(数模板+类模板)

    目录 一.函数模板 1.函数模板介绍 2.函数模板与重载函数的关系 3.函数模板实现机制 二.类模板 1.类模板基本语法 2.类模板内函数的整体布局[分文件使用类模板] 3.类模板的static与模板类的static 4.数组实现万能容器 前言: 由于C++是静态语言,也就是说使用一个数据的时候必须先指定类型,这样的操作在编译后变量的类型是无法轻易改变的,就导致扩展性太差.或者一个函数需要很多次重载的时候,代码显得冗杂,由此产生了C++函数模板. 一.函数模板 1.函数模板介绍 ① 函数模板的产

  • C++模板基础之函数模板与类模板实例详解

    泛型编程  如果让你编写一个函数,用于两个数的交换.在C语言中,我们会用如下方法: // 交换两个整型 void Swapi(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; } // 交换两个双精度浮点型 void Swapd(double* p1, double* p2) { double tmp = *p1; *p1 = *p2; *p2 = tmp; }  因为C语言不支持函数重载,所以用于交换不同类型变量的函数的函数名是不

  • EasyC++函数模板介绍

    文章转自: 公众号:Coder梁(ID:Coder_LT) 函数模板: 所谓函数的模板,本质上也就是使用泛型来定义函数. 所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,可以定义存储int型的vector也可以定义存储float类型的,也可以定义存储其他类型.我们在声明的时候将存储的类型当做参数传给了模板. 泛型可以用具体的类型,比如(int或double)替换,通过将类型作为参数传给模板,编译器会根据传递的参数类型生成该类型的函数.这种方式也被

  • C++函数模板介绍

    文章转自: 公众号:Coder梁(ID:Coder_LT) 函数模板: 所谓函数的模板,本质上也就是使用泛型来定义函数. 所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,可以定义存储int型的vector也可以定义存储float类型的,也可以定义存储其他类型.我们在声明的时候将存储的类型当做参数传给了模板. 泛型可以用具体的类型,比如(int或double)替换,通过将类型作为参数传给模板,编译器会根据传递的参数类型生成该类型的函数.这种方式也被

  • 用函数模板,写一个简单高效的 JSON 查询器的方法介绍

    JSON可谓是JavaScript的亮点,它能用优雅简练的代码实现Object和Array的初始化.同样是基于文本的数据定义,它比符号分隔更有语义,比XML更简洁.因此越来越多的JS开发中,使用它作为数据的传输和储存. JS数组内置了不少有用的方法,方便我们对数据的查询和筛选.例如我们有一堆数据: 复制代码 代码如下: var heros = [        // 名============攻=====防=======力量====敏捷=====智力====        {name:'冰室女巫

  • C++函数模板与类模板相同与不同介绍

    目录 1.模板 1.1何为模板 1.2C++的模板的形式有两种 1.3如何定义一个函数模板 1.4语法形式 1.5模板的编译机制 2.函数模板 2.1调用方式 2.2函数模板的特化与调用优先级 3.可变参函数模板 3.1概念 3.2代码实现(实现一个c中的printf的函数) 4.类模板 4.1类模板的定义形式 4.2代码实例 5.类模板中的特殊属性的初始化方式及继承与多态 5.1代码实例 5.2使用类模板去实现一个数据结构 5.3类模板的特化 5.4C++中类模板中的内嵌类 1.模板 1.1何

  • C++ Template 基础篇(一):函数模板详解

    Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第一部分. 为什么要有泛型编程 C++是一门强类型语言,所以无法做到像动态语言(python javascript)那样子,编写一段通用的逻辑,可以把任意类型的变量传进去处理.泛型编程弥补了这个缺点,通过把通用逻辑设计为模板,摆脱了类型的限制,提供了继承机制以外的另一种抽象机制,极大地提升了代码的可重用性. 注意:模板定义本身不参与编译,而是编译器根据模板的用户使

  • C++ 函数的介绍

    目录 一.基础 二.参数 三.返回类型 四.函数重载与解析 五.内联函数 1.constexpr函数 六.函数指针 七.思考 1.我们常常会见到如下代码,是由什么作用? 2.可以用别名定义一个函数类型吗? 一.基础 函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体: 函数头: 函数名称(标识符),用于后续的调用: 形式参数,代表函数的输入参数: 返回类型,函数执行完成后返回结果的类型: 函数体:一个语句块(block),包含具体的计算逻辑: 函数的声明与定义: 函数声明只

  • C++ 函数的介绍

    目录 一.基础 二.参数 三.返回类型 四.函数重载与解析 五.内联函数 1.constexpr函数 六.函数指针 七.思考 1.我们常常会见到如下代码,是由什么作用? 2.可以用别名定义一个函数类型吗? 一.基础 函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体: 函数头: 函数名称(标识符),用于后续的调用: 形式参数,代表函数的输入参数: 返回类型,函数执行完成后返回结果的类型: 函数体:一个语句块(block),包含具体的计算逻辑: 函数的声明与定义: 函数声明只

随机推荐