C++模板与泛型编程

2023-11-05

前言
泛型是独立于任何特定类型的编码,在C++中,我们经常使用的容器vector,该容器可以定义不同种类的vector,如vector list、vector list或自定义类型等。

函数模板
如果要编写一个函数来比较两个数的大小,返回其中最大值,这两个数可以是int型,也可以是double型或者自定义类型等,要想用一个函数实现上述功能,则模板函数就派上用场了。

template <typename T> 
T compare(const T& v1, const T& v2) {
    if (v1 < v2) {
        return v2;
    }
    return v1;
}

int main(int argc, char const *argv[])
{
    int max = compare(23, 34);
    cout<<"max = "<<max<<endl;         //输出结果34
    return 0;
}

上述代码中可以看到函数模板定义和使用方法,首先模板定义固定格式:

template <typename T>   // 必须以template 开头,typename表示类型名,也可以用class替换,T表示形参,可以说随便命名。

使用的时候编译器会将具体使用的类型来替换掉"T",这里是用int替换掉"T"。

类模板
跟定义函数模板一样,也可以定义类模板。具体可以参考智能指针与引用计数详解(二)中的技术类模板定义:

template <typename T>
class U_Ptr {
    private:
    friend class HasPtr<T>;
    U_Ptr(T *p);
    ~U_Ptr();
    T *m_ip;
    int m_useCount;
};

类模板也是模板,所以都是以template开头,后接模板形参表。不过使用的时候必须显示指定实参(尖括号里边的类型):

HasPtr<int> ptr(p, 20);  // 显示指定实参为int

typename和class区别
在函数模板形参表中,关键字typename和class具有相同含义,可以互换使用,两个关键字都可以在同一模板形参表中使用:

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

使用关键字typename代替关键字class指定模板类型形参也许更为直观,毕竟,可以使用内置类型(非类类型)作为实际的类型形参,而且,typename更清楚地指明后面的名字是一个类型名。但是,关键字typename是作为标准C++的组成部分加入到C++中的,因此旧程序更有可能只用关键字class。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++模板与泛型编程 的相关文章

  • C++多态

    个人简介 作者简介 大家好 我是菀枯 支持我 点赞 收藏 留言 格言 不要在低谷沉沦自己 不要在高峰上放弃努力 前言 之前我们已经将面向对象三大特性中的封装和继承讲了 接下来剩下最后一个环节了 那就是 多态 多态概念 通俗来说 就是去做相同
  • C++学习(四十一)stderr stdout

    stdout 标准输出设备 stderr 标准错误输出设备 两者默认向屏幕输出 但如果用转向标准输出到磁盘文件 则可看出两者区别 stdout输出到磁盘文件 stderr在屏幕 在默认情况下 stdout是行缓冲的 他的输出会放在一个buf
  • typedef struct

    用途一 定义一种类型的别名 而不只是简单的宏替换 可以用作同时声明指针型的多个对象 比如 char pa pb 这多数不符合我们的意图 它只声明了一个指向字符变量的指针 和一个字符变量 以下则可行 typedef char PCHAR PC
  • C++ bind与回调函数

    1 回调函数 注册回调函数里可以使用functional来统一接口 可以传入函数指针 lambda bind等 函数1 2 为一个模块 为回调函数 函数3为一个模块 为注册回调函数 形参为函数指针 注册回调函数的入参为函数指针 指向回调函数
  • C++之const类成员变量,const成员函数,const指针

    https www cnblogs com cthon p 9178701 html 结合下面这个链接观看更佳 讲常量指针和指向常量的指针的 https www cnblogs com lihuidashen p 4378884 html
  • 50个知名的开源网站

    1 http snippets dzone com tag c 数以千计的有用的C语言源代码片段 2 http www hotscripts com category c cpp scripts programs Hotscripts 提供
  • C++类中this指针的理解

    https www cnblogs com liushui sky p 5802981 html 很好的文
  • C++学习(三十四)stdlib与cstdlib

    C语言中是有 include
  • C++之对封装、继承、多态的理解

    目录 一 对封装 继承和多态的简单理解 二 举例 1 封装的例子 2 继承的例子 3 多态的例子 三 代码实现 1 封装 C 或Java实现 2 继承 C 或Java实现 3 多态 C 或Java实现 四 以一个简单的实例 剖析 封装 的实
  • C++学习(四三五)android获取so安装路径

    ClassLoader loader getClassLoader try Method library ClassLoader class getDeclaredMethod findLibrary String class String
  • osgEarth的Rex引擎原理分析(一二三)osgEarth的缓存及其结构

    目标 十七 中问题43 1 缓存分两类 1 文件缓存 osgDB FileCache FileSystemCache 位于osgEarthDrivers cache filesystem FileSystemCache osgDB File
  • c++ char数组转string

    代码 char数组的路径转string的路径 void charArrayPath2string char char array path MAX PATH std string string path std stringstream s
  • C++ 类大小分析

    以下测试代码的运行环境 Ubuntu 16 04 4 LTS gcc version 4 8 5 x64 空类 单一继承的空类 多重继承的空类所占空间大小为 1 字节 实例在内存中都有一个独一无二的地址 为了达到这个目的 编译器往往会给一个
  • vscode使用ssh远程linux可视化开发环境搭建

    目录 1 搭建 vscode 远程开发流程 2 在线搭建环境 3 离线搭建环境 4 ssh免密登录 设置白名单 5 参考文档 最近一直在做服务引擎开发 编译都是在服务器linux环境中进行 每次调试使用gdb修改使用vim贼麻烦 最后找了下
  • C++的指针与引用可能并不难,只是你没理解

    目录 复合类型 引用 引用即别名 引用的定义 引用的两种例外情况 指针 获取对象的地址 指针值 利用指针访问对象 某些符号有多重含义 空指针 建议 初始化所有指针 赋值和指针 其他指针操作 void 指针 理解复合类型的声明 定义多个变量
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • C语言:结构体中(.)和(->)的区别

    首先 要了解 a b 等价于 a gt b 概念上 一般情况下用 只需要声明一个结构体 格式是 结构体类型名 结构体名 然后用结构体名加 加域名就可以引用域 了 因为自动分配了结构体的内存 如同 int a 一样 而用 gt 则要声明一个结
  • 无法从命令行或调试器启动服务,必须首先安装Windows服务....。在“安装”阶段发生异常。 System.Security.SecurityException:未找到源

    此处一共两个问题 第一个问题完整描述是 无法从命令行或调试器启动服务 必须首先安装Windows服务 使用installutil exe 然后用ServerExplorer Windows服务器管理工具或NET START命令启动它 第二个
  • 所有OLE接口

    比较有用 记录下来供查阅 常规 函数 lUnknown 目的 控制的接口协商的对象生存期 普遍存在的任何组件 而不考虑实现 QueryInterface 公开传入的接口 函数 IEnum 目的 枚举的各种类型的列表 在许多情况下 整个 OL
  • C#学习 - 事件 续

    事件声明 完整声明 using System namespace ConsoleApp1 internal class Program static void Main string args Customer customer new C

随机推荐

  • 随机生成小球(万家灯火的感觉)

    事发年前 新冠之前 拿到一张psd 全部静态 老板说想让他动起来 在我们这种老板吃死技术的小公司只能自己想办法 你想要ui no我们只有美工哈哈哈 独立自强的我瞬间想到transition enter leave cubic bezier之
  • 利用Python进行心脏病患者特征分析

    今天要跟大家说到的一个数据集分析 是关于心脏病的 心脏病作为全球第一大杀手 是我们不得不提前防御的疾病 今天我们利用Python从一份心脏病数据集中找出一些规律 看下哪些特征对于确诊心脏病影响比较大 从而提醒我们注意平时的生活规律 数据集介
  • 解决报错error resource androidattrdialogCornerRadius not found

    解决报错error resource android attr dialogCornerRadius not found 1 问题描述 运行Android Studio程序 产生报错error resource android attr d
  • 计算机大三学生怎么找实习工作?学了计算机很迷茫怎么办?

    学了计算机很迷茫怎么办呢 很多计算机大三学生找不到实习工作 也不知道从哪找实习工作 甚至常常怀疑自己的学习有没有意义 今日就由小编为大家简要介绍下吧 学了计算机很迷茫怎么办 学了计算机很迷茫怎么办呢 经常有很多学生发生这样的感慨 事实上绝大
  • sklearn中的fit_transform和transform以及什么时候使用

    在使用sklearn对数据进行预处理的时候很有可能会遇到fit transform和transform 网上不少资料写的模棱两可 在这里我回答几个核心问题 也许看完我写的这篇文章 一些疑惑就会豁然开朗 为什么在训练集进行fit而不在测试集f
  • c++的并归排序怎么写

    答 C 的并归排序的写法如下 1 如果数组只有一个元素 则返回该元素 2 否则 将数组分成两半 3 使用递归 对每一半进行并归排序 4 将排序后的两个子数组合并 5 返回排序后的结果
  • C语言回调函数一个简单的例子

    回调函数通俗的解释 普通函数 你所写的函数调用系统函数 你只管调用 不管实现 回调函数 系统调用你所写的函数 你只管实现 不管调用 以下是使用 语言实现回调函数的一个例子 代码 include
  • Microsoft Excel 无法插入新的单元格,因为这会将非空单元格推送到工作表的末尾...的问题解决

    这个问题的出现应该是最后一行或一列有数据 按以下步骤操作 1 选中文字表格最后一列空白列 随后按ctrl shift 向右 选中整列 点击右键删除 2 选中文字表格最后一行空白列 随后按ctrl shift 向右 选中整行 点击右键删除
  • Springboot 集成 Groovy Script 完整示例

    Springboot 集成 Groovy Script 完整示例 使用Spring Boot集成Groovy Script来实现动态规则解析和执行的Demo 以下是实现步骤 1 创建Spring Boot项目 首先 创建一个Spring B
  • 测试代码(测试函数、测试类)

    测试函数 def get name first last full name first last return full name title from name import get name print Enter q at any
  • Using a Single Business Pattern with the RUP -part3

    Using IBM Patterns for e business during inceptionKey goals of the RUP inception phase are A vision that establishes the
  • 逆向工程Python爬虫——国税局发票查验平台

    前言 这是一篇含金量很高的干货文章 笔者将手把手带领各位一步一步地实现爬取国家税务总局全国增值税发票查验平台 以下简称 查验平台 这个想法诞生在19年初 当时在做一款通过扫描二维码就可以查验发票的小程序 当时由于笔者学艺尚浅 没办法模拟请求
  • 浏览器localStorage

    Window localStorage 属性 JavaScript 存储对象 JavaScript 存储对象 实例 使用 localStorage 创建一个本地存储的 name value 对 name lastname value Smi
  • 解决jupyter notebook打开时找不到想要的文件

    原因 打开notebook默认显示的是当前目录下的文件 标题 解决办法 打开cmd用dos命令将当前目录切换到想用notebook打开的文件所在的文件夹 已经切换到了文件所在的目录 所以用命令jupyter notebook打开notebo
  • 重装pytorch历程-问题-解决

    用conda install时报错 An HTTP error occurred when trying to retrieve this URL HTTP errors are often intermittent 我要做的事 想使用to
  • 微软D365 入门文章汇总以及各项认证介绍(持续跟新.....)

    介绍 希望入门D365的同学们 需要具备的知识点 涉及C WebApi 前端知识 Power Platform等知识 以及Azure的知识点等 需要有了解 实施Microsoft Dynamics 365 CE 12章 实施Microsof
  • 多线程异常 和 事务(一)

    1 首先提出几个问题 1 1 子线程中的异常在主线程中是否可以catch 1 2 在spring中主线程有事务 那么子线程中有事务码 2 先看第一个问题 2 1 我们在main方法里面测试 代码如下 package com pingan t
  • 理解 glibc malloc:malloc() 与 free() 原理图解

    本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程 本文不过度关注细节 因此只是分别从arena层次 bin层次 chunk层次进行图解 而不涉及有关指针的具体操作 前言 Arena级分析 main arena中的内存申请 t
  • QuickLook搭配Everthing提高工作效率

    因为我的Everthing已经默认以管理员启动了 所以QuickLook也要以管理员权限启动才能查看Everthing中的文件 而QuickLook本身不能以管理员权限启动 所以需要在任务计划程序中设置 步骤 Ctrl R打开CMD 输入t
  • C++模板与泛型编程

    前言 泛型是独立于任何特定类型的编码 在C 中 我们经常使用的容器vector 该容器可以定义不同种类的vector 如vector list vector list或自定义类型等 函数模板 如果要编写一个函数来比较两个数的大小 返回其中最