C++泛型编程

1. 基本概念

1.1 泛型编程(Generic Programming)

泛型编程是C++中一种重要的编程范式,它通过 参数化类型 来实现代码的通用性和复用性。

1.2 模板(Templates)

模板 是泛型编程的基础,允许编写与数据类型无关的代码。

模板分类:

  • 函数模板:参数化函数的参数类型。

  • 类模板:参数化类的成员类型。

  • 使用 template 关键字声明模板,typenameclass 声明模板类型,代表一个占位符类型,将在实例化时被具体类型替换。

template<typename T1 , typename T2 , ...>

2. 函数模板

2.1 函数模板语法

template<typename T>
void function( T arg1, T arg2 ) {// ...
}

2.2 函数模板的实例化

函数模板的实例化分为隐式实例化和显示实例化

  • 隐式实例化:编译器根据形参推演模板参数的实际类型。

  • 显示实例化:在函数名后<>中指定模板参数的实际类型。

template<typename T>
T add(const T& x , const T& y) {return x + y;
}int main () {add(10 , 20);        // 隐式实例化 T为intadd(1.1 , 2.2);      // 隐式实例化 T为double// add(10 , 1.1);    // 编译不通过,因为无法确定T为 int 还是 double 类型add<int>(10 , 1.1);  // 通过显示实例化解决return 0;
}

注意:对于非模板函数和同名函数模板,如果其他条件都相同,会优先调用非模板函数。

3. 类模板

3.1 类模板语法

template<typename T1 , typename T2 , ...>
class ClassName {// ...
};

3.2 类模板的实例化

类模板必须显示实例化。

template<typename T>
class vector {// ...private:T* start = nullptr;T* finish = nullptr;T* end_of_storage = nullptr;
};int main () {// 显示实例化vector<int> v1; vector<double> v1; return 0;
}

4. 非类型模板参数

非类型模板参数是C++模板中一种特殊的参数类型,它允许在编译时传递值而不是类型作为模板参数。

非类型模板参数可以是以下类型之一

  • 整型

  • 指针或引用类型

  • C++20起支持浮点类型作为模板参数

  • C++20起支持类类型作为模板参数

template<typename T, size_t N = 10>
class Array {// ...T arr[N];
};int main () {Array<> arr1;    // 使用缺省值的写法Array<5> arr2;Array<15> arr3; return 0;
}

5. 模板的特化

模板特化是C++中为特定类型提供的模板定制。它允许我们为特定类型提供优化的或不同的实现,同时保留通用模板的灵活性。

5.1 函数模板的特化

函数模板也可以特化,但通常更推荐使用函数重载

函数模板特化步骤

  1. 特化必须声明在主模板之后。

  2. 关键字template后面接一对空的尖括号<>。

  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型。

  4. 特化模板的函数形参必须要和基础模板的函数形参完全相同。

template<typename T>
bool less(T left , T right) {return left < right;
}// 对 int* 特殊化处理
template<>
bool less<int*>(int* left , int* right) {return *left < *right;
}// 更推荐使用函数重载
bool less (int* left , int* right) {return *left < *right;
}

注意:函数模板不能偏特化,但可以通过函数重载实现。

5.2 类模板的特化

类模板特化分为全特化和偏特化两种形式。

  • 全特化:为模板的所有参数指定具体类型或值,完全特化整个模板。

  • 偏特化:只特化部分模板参数,或者对模板参数施加某种模式或约束。

5.2.1 全特化
// 主模板定义
template <typename T1, typename T2>
class MyClass {// 通用实现
};// 全特化
template <>
class MyClass<int, double> {// 针对<int, double>的特化实现
};
5.2.2 偏特化(特化部分模板参数)
// 主模板定义
template <typename T1, typename T2>
class MyClass {// 通用实现
};// 偏特化/半特化
template <typename T1>
class MyClass<T1, double> {// 针对<T1, double>的特化实现
};

注意:全特化和偏特化都存在时,全特化版本比偏特化版本具有更高的优先级。

5.2.3 偏特化(对模板参数施加某种约束)
// 主模板定义
template <typename T1, typename T2>
class MyClass {// 通用实现
};// 偏特化/半特化
template <typename T1 , typename T2>
class MyClass<T1*, T2*> {// 针对<T1*, T2*>的特化实现
};// 偏特化/半特化
template <typename T1 , typename T2>
class MyClass<T1&, T2&> {// 针对<T1&, T2&>的特化实现
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92000.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92000.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92000.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js + Node.js 开发前后台框架

在 Vue.js + Node.js 开发前后台框架时,推荐采用现代化的技术栈组合和最佳实践。以下是一个高效、可扩展的全栈框架方案: 技术栈推荐 层级 技术选型 说明 前端框架 Vue 3 (Composition API) 最新Vue核心库,推荐使用<script setup>语法 UI组件库 Element Plus / Ant D…

Vision Transformer (ViT) 详解:当Transformer“看见”世界,计算机视觉的范式革命

摘要: 长久以来&#xff0c;卷积神经网络&#xff08;CNN&#xff09;凭借其精心设计的归纳偏置&#xff08;inductive biases&#xff09;&#xff0c;无可争议地统治着计算机视觉领域。然而&#xff0c;一篇名为《An Image is Worth 16x16 Words》的论文彻底改变了这一格局&a…

go goroutine chan 用法

方法1 代码 package mainimport ("fmt""sync""time" )func main() {allChan : make(chan interface{}, 3)var sendWg, recvWg sync.WaitGroup // 分别同步发送和接收// 发送goroutinesendWg.Add(1)go func() {defer sendWg.Done()for i : 0; i &…

Web前端文件上传安全与敏感数据安全处理

一、文件上传安全1. 文件上传时的核心安全检查点文件上传是 Web 应用的高风险功能&#xff0c;需从多维度验证&#xff0c;防止恶意文件上传&#xff08;如木马、病毒&#xff09;或路径攻击&#xff0c;关键检查点包括&#xff1a;MIME 类型验证检查请求头中的 Content-Type&a…

文法中的间接左递归

&#x1f31f; 第一步&#xff1a;理解基本概念✅ 什么是文法&#xff08;Grammar&#xff09;&#xff1f;在编程语言或语法分析中&#xff0c;文法 是一组规则&#xff0c;用来描述一种语言的结构。例如&#xff1a;S → A a A → B b B → S c 这表示&#xff1a;S 可以…

Anthropic:跨越生产效能拐点的AI增长飞轮

资本竞赛中的战略转折点 人工智能领域的竞争已经从理念之争演变为资本、算力与地缘政治影响力的全面较量。Anthropic传闻中的1700亿美元估值&#xff0c;如果成为现实&#xff0c;将标志着前沿AI发展格局的地震式转变。这不仅仅是构建更智能模型的问题&#xff0c;更是为主导下…

【Unity3D实例-功能-移动】小兵移动-通过鼠标点击进行

在Unity的世界里&#xff0c;当你轻点鼠标&#xff0c;角色仿佛被赋予了新的使命&#xff0c;沿着一条无形的轨迹&#xff0c;向着地图上的目标点进发。每一次移动&#xff0c;不仅是简单的位移&#xff0c;更是对未知的探索。这种交互&#xff0c;让玩家与游戏世界紧密相连&am…

从0到1学PHP(十四):PHP 性能优化:打造高效应用

目录一、PHP 性能评估与分析1.1 性能指标体系1.2 性能分析工具使用1.3 性能瓶颈定位方法与流程二、代码层面优化技巧2.1 高效的循环与条件判断写法2.2 函数与类的优化设计2.3 内存管理与垃圾回收机制优化三、缓存策略与实现3.1 数据缓存3.2 页面缓存与部分缓存技术3.3 OPcache …

移动管家手机控车系统硬件安装与软件绑定设置

移动管家手机控车系统硬件安装与软件绑定配合使用&#xff0c;具体设置步骤如下&#xff1a;一、硬件安装准备 ‌加装智能控制主机‌&#xff1a;需在车辆上加装移动管家专用智能控制模块&#xff0c;该模块需与原车电路系统连接&#xff0c;并将原车钥匙芯片焊接至主控盒内以实…

51单片机入门:数码管原理介绍及C代码实现

本文是江协科技up的课堂笔记&#xff01;大家可以去bilibili配合这位up的51单片机入门教程食用&#xff0c;效果更佳~我这里进行详细介绍&#xff0c;希望你忘记数码管的时候来这里看看&#xff01;&#xff08;你猜我为什么写这个TAT&#xff09;一.基本介绍LED数码管&#xf…

Apache Camel 简介

相关文档地址 https://camel.apache.org/components/next/index.htmlhttps://camel.apache.org/components/4.10.x/languages/simple-language.htmlhttps://camel.apache.org/manual/exception-clause.htmlhttps://camel.apache.org/manual/index.htmlhttps://camel.apache.org…

IP离线库 输入IP地址立即返回IP所在地址信息(支持Java、Python)

描述 本文实现&#xff1a; 1、离线查询IP地址 2、IP地址精确到区域 3、IP地址支持国外IP 此时需要一个创建&#xff0c;比如我输入一个8.8.8.8的IP立马就需要返回给我一个中文地址信息&#xff0c; 类似于百度的IP搜索&#xff1a; 113.111.186.123如果现在离线环境或者在…

解决MySQL删除/var/lib/mysql下的所有文件后无法启动的问题

删除 MySQL 数据目录 /var/lib/mysql 下的所有文件后&#xff0c;MySQL 将无法启动&#xff0c;因为该目录包含了数据库的所有数据文件、配置文件和系统表。当这些文件被删除时&#xff0c;MySQL 无法找到必要的数据和配置&#xff0c;从而无法正常启动。本文将详细介绍解决这个…

苍穹外卖项目学习——day1(项目概述、环境搭建)

文章目录一、软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境分类二、苍穹外卖项目介绍2.1 定位2.2 功能架构2.3 技术选型三、开发环境搭建3.1 前端环境3.2 后端环境3.3 前后端联调3.4 登录功能优化四、接口文档管理4.1 YApi4.2 Swagger (Knife4j)一、软件开发整体介…

【QT】Qt信号与槽机制详解信号和槽的本质自定义信号和槽带参数的信号和槽

文章目录前言一、信号的本质二、槽的本质三、 信号和槽的使⽤3.1 连接信号和槽四、使用步骤4.1 通过QtCreator⽣成信号槽代码五、 ⾃定义信号和槽5.1 ⽰例1&#xff1a;信号和槽函数初步使用5.2 ⽰例2 两个类使用5.3 示例3 按钮使用触发信号六、 带参数的信号和槽6.1 ⽰例1&…

【OD机试题解法笔记】文件缓存系统

题目描述 请设计一个文件缓存系统&#xff0c;该文件缓存系统可以指定缓存的最大值&#xff08;单位为字节&#xff09;。 文件缓存系统有两种操作&#xff1a; 存储文件&#xff08;put&#xff09;读取文件&#xff08;get&#xff09; 操作命令为&#xff1a; put fileName …

Python中的sys.path与PYTHONPATH全解析:模块导入路径的底层机制与最佳实践

在Python项目开发中&#xff0c;很多人遇到过类似“模块导入失败”、“路径找不到”、“相对导入与绝对导入混乱”等问题。而这些问题的根源&#xff0c;几乎都绕不开一个核心概念——Python模块搜索路径。 今天&#xff0c;我们围绕sys.path 和 PYTHONPATH环境变量&#xff0…

python:如何调节机器学习算法的鲁棒性,以支持向量机SVM为例,让伙伴们看的更明白

鲁棒性&#xff08;Robustness&#xff09;指模型在噪声数据或异常值干扰下保持性能稳定的能力。想详细了解的可参考本人之前的博文 python机器学习&#xff1a;评价智能学习算法性能与效果的常见术语&#xff1a;不收敛、过拟合、欠拟合、泛化能力、鲁棒性一句话、一张图给您…

号源加锁升级思路(解决高并发问题)

原先逻辑链接&#xff1a;号源预约加锁思路_java 预约 接口加锁-CSDN博客 一、进行治疗项目和号源数据缓存 1.新建一个定时任务&#xff0c;主要在凌晨时缓存治疗项目和号源数据 1.1.类中使用redission获取锁&#xff08;用于分布式系统获取数据&#xff0c;保证原子性&…

MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接

> 一条标准化的数据通道,让AI从“对话专家”蜕变为“行动专家”,背后是一场由协议驱动的工具连接革命。 2024年11月,Anthropic公司开源了**Model Context Protocol(MCP)**。在短短9个月内,这项技术彻底改变了AI与外部世界的交互方式。截至2025年8月,MCP服务数量**从…