C++中的Template常见用法

目录

摘要

函数模板

基本用法

重载与特化

类模板

基本用法

模板特化(Specialization)与偏特化(Partial Specialization)

别名模板(Alias Templates)

基本用法

变量模板(Variable Templates)

基本用法

模板模板参数(Template Template Parameters)

基本用法

总结


摘要

C++中的模板(template)是一种非常强大的工具,用于泛型编程和代码复用。模板可以分为函数模板、类模板、别名模板、变量模板、模板模板参数等。这些模板能够处理任意类型的数据,提高代码的灵活性和可重用性。

函数模板

函数模板允许函数对任意类型的数据进行操作。

基本用法

#include <iostream>template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}int main() {std::cout << "Max of 3 and 7: " << max(3, 7) << std::endl;std::cout << "Max of 3.5 and 2.1: " << max(3.5, 2.1) << std::endl;std::cout << "Max of 'a' and 'z': " << max('a', 'z') << std::endl;return 0;
}

重载与特化

函数模板可以与普通函数重载,并且可以进行模板特化。

#include <iostream>template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}// 特化版本
template <>
const char* max(const char* a, const char* b) {return (std::strcmp(a, b) > 0) ? a : b;
}// 重载版本
int max(int a, int b) {return (a > b) ? a : b;
}int main() {std::cout << "Max of 3 and 7: " << max(3, 7) << std::endl;std::cout << "Max of \"hello\" and \"world\": " << max("hello", "world") << std::endl;return 0;
}// Out
Max of 3 and 7: 7
Max of "hello" and "world": world

类模板

类模板允许类处理任意类型的数据。

基本用法

#include <iostream>template <typename T>
class Pair {
private:T first, second;
public:Pair(T a, T b) : first(a), second(b) {}T getFirst() const { return first; }T getSecond() const { return second; }
};int main() {Pair<int> intPair(1, 2);Pair<double> doublePair(3.4, 7.8);std::cout << "First of intPair: " << intPair.getFirst() << std::endl;std::cout << "Second of doublePair: " << doublePair.getSecond() << std::endl;return 0;
}

模板特化(Specialization)与偏特化(Partial Specialization)

类模板可以进行全特化(Full Specialization)和偏特化(Partial Specialization -- 偏特化仅在类模板中支持)。

#include <iostream>// 主模板
template <typename T>
class Storage {
private:T value;
public:Storage(T val) : value(val) {}void print() const { std::cout << "Value: " << value << std::endl; }
};// 全特化版本
// 全特化是为模板的某个具体类型提供完全不同的实现。
template <>
class Storage<const char*> {
private:const char* value;
public:Storage(const char* val) : value(val) {}void print() const { std::cout << "Value: " << value << std::endl; }
};// 偏特化版本
// 偏特化是指为模板的一部分参数提供特定的实现,而不是所有参数。偏特化仅适用于类模板,而不适用于函数模板。
template <typename T>
class Storage<T*> {
private:T* value;
public:Storage(T* val) : value(val) {}void print() const { std::cout << "Pointer Value: " << *value << std::endl; }
};int main() {Storage<int> intStorage(5);Storage<const char*> stringStorage("Hello");int value = 10;Storage<int*> intPointerStorage(&value);intStorage.print();stringStorage.print();intPointerStorage.print();return 0;
}// Out
Value: 5
Value: Hello
Pointer Value: 10

别名模板(Alias Templates)

别名模板用于创建复杂类型的简化别名。

基本用法

#include <iostream>
#include <vector>// 定义一个别名模板
template <typename T>
using Vec = std::vector<T>;int main() {Vec<int> intVec = {1, 2, 3, 4, 5};for (int i : intVec) {std::cout << i << " ";}std::cout << std::endl;return 0;
}

变量模板(Variable Templates)

变量模板允许定义模板变量。

基本用法

#include <iostream>// 定义一个变量模板
template <typename T>
constexpr T pi = T(3.1415926535897932385);int main() {std::cout << "pi<int>: " << pi<int> << std::endl;std::cout << "pi<float>: " << pi<float> << std::endl;std::cout << "pi<double>: " << pi<double> << std::endl;return 0;
}// Out
pi<int>: 3
pi<float>: 3.14159
pi<double>: 3.14159

模板模板参数(Template Template Parameters)

模板模板参数允许模板参数本身是模板。

基本用法

#include <iostream>
#include <vector>// 定义一个模板类
template <typename T, template <typename, typename> class Container>
class Stack {
private:Container<T, std::allocator<T>> elements;
public:void push(const T& elem) {elements.push_back(elem);}void pop() {if (elements.empty()) {throw std::out_of_range("Stack<>::pop(): empty stack");}elements.pop_back();}T top() const {if (elements.empty()) {throw std::out_of_range("Stack<>::top(): empty stack");}return elements.back();}
};int main() {Stack<int, std::vector> intStack;intStack.push(7);intStack.push(42);std::cout << "Top of intStack: " << intStack.top() << std::endl;intStack.pop();std::cout << "Top of intStack after pop: " << intStack.top() << std::endl;return 0;
}// Out
Top of intStack: 42
Top of intStack after pop: 7

总结

1. 模板实例化
模板实例化发生在使用模板时,编译器会根据模板参数生成具体类型的代码。模板实例化可能会导致代码膨胀(code bloat),因为每个不同的模板参数都会生成一份独立的代码。

2. 模板元编程
模板元编程是利用模板在编译时进行计算和逻辑判断的技术,常用于实现复杂的数据结构和算法。

3. 编译错误
模板代码的编译错误信息通常较难理解,因为错误通常发生在模板实例化的过程中。

4. 类型推导
模板参数的类型推导有时会遇到困难,特别是在模板函数中。

5. 递归模板实例化
在某些高级用法中,模板可能会涉及递归实例化(如元编程)。这种情况下,需要确保递归在某个点终止,以避免编译时无限递归。

我们可以通过合理使用函数模板、类模板、别名模板、变量模板和模板模板参数,能在一定程度上提高代码的灵活性和可维护性。然而,模板的使用也带来了一些复杂情况和注意事项,如编译时间、代码膨胀、调试困难等。所以在实际项目中,根据项目需求,我们需要合理设计和选择模板,这样能够有效地避免问题的发生。

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

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

相关文章

EXCEL从图片链接获取图片

step1: 选中图片地址列 step2:开发工具→Visual Basic 文件→导入 导入我制作的脚本&#xff08;代码见文章末尾&#xff09; 点击excel的小图标回到表格界面。 点击【宏】 选中刚才导入的脚本&#xff0c;点执行&#xff0c;等待完成。 代码本体&#xff1a; Sub InsertPict…

端午档新片速递《谈判专家》领衔,每日影视作品推荐❗❗❗多部佳作待映

每日影视作品推荐一、新片速递《谈判专家》上映时间&#xff1a;2024年端午档预售情况&#xff1a;已开启预售&#xff0c;并有望成为该档期的票房冠军备注&#xff1a;据猫眼专业版数据&#xff0c;该片备受期待 《我才不要和你做朋友呢》上映时间&#xff1a;2024年端午档期预…

9. MySQL事务、字符集

文章目录 【 1. 事务 Transaction 】1.1 事务的基本原理1.2 MySQL 执行事务的语法和流程1.2.1 开始事务1.2.2 提交事务1.2.3 回滚&#xff08;撤销&#xff09;事务实例1&#xff1a;一致性实例2&#xff1a;原子性 【 2. 字符集 和 校对规则 】2.1 基本原理2.2 查看字符集查看…

通过SDKMan来安装各种版本的JDK

准备工作&#xff1a; 1. 打开命令行工具&#xff1a;首先&#xff0c;你需要打开电脑上的命令行工具。在Windows上是“命令提示符”或“PowerShell”&#xff0c;Mac或Linux上是“终端”。 安装SDKMan&#xff1a; 1. 安装SDKMan&#xff1a;在命令行中输入以下命令并按…

亚马逊 AWS 视频转码功能、AWS Elemental MediaConvert 中创建和管理转码作业

上传的视频需要转码成不同的编码, 可以直接在 AWS Elemental MediaConvert 中创建和管理转码作业 AWS Elemental MediaConvert 中创建和管理转码作业 /*** 视频转码* return bool* author wzb* data 2024/5/30*/function videoTranscode(&$data){$fileId $data[id] ?? …

Python用于存储和组织大型数据集的文件格式库之h5py使用详解

概要 在科学计算和数据分析中,大规模数据集的存储和管理是一个重要的问题。HDF5(Hierarchical Data Format version 5)是一种用于存储和组织大型数据集的文件格式。Python 的 h5py 库是一个用于与 HDF5 文件交互的接口,它结合了 HDF5 的强大功能和 Python 的易用性,使得处…

微信小游戏性能优化解决方案全新发布

小游戏凭借其简单易上手、玩法多样、互动性强的特点&#xff0c;迅速在市场中崭露头角。MMO、ARPG、卡牌等游戏类型也纷纷入局。玩家对启动时间长、发热、加载缓慢、闪退等问题也越来越敏感。 为了突破这些性能瓶颈&#xff0c;UWA全新发布了针对微信小游戏的性能优化解决方案…

clickhouse学习笔记(一)入门与安装

目录 一 、入门 简介 核心特性包括 1.1 列式存储 1.2 原生压缩 1.3 向量化执行引擎 1.4 DBMS 功能 1.5 分布式处理 1.6 高吞吐写入能力 1.7 实时分析 1.8 SQL支持 1.9 高度可扩展 1.10 数据分区与线程级并行 1.11 应用场景 1.12 不适用场景 二、ClickHouse单机版…

【C++PCL】点云处理KD-ICP配准

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 重点:每个模块都有参数如何调试的讲解,即调试某个参数对结果的影响是什么,大家有问题可以评论哈,如果文章有错误的地方,欢迎来指出错误的…

多线程调用同一个不包含可变状态,并且是线程安全的方法时,可同时执行,不必等待排队

多线程调用同一个不包含可变状态&#xff0c;并且是线程安全的方法时&#xff0c;可同时执行&#xff0c;不必等待排队 前言同时执行方法的条件示例并发执行的优势实验验证总结 前言 如果方法不包含可变状态&#xff0c;并且是线程安全的&#xff0c;那么在高并发环境下&#…

深度学习中torch.max函数的作用

文章目录 解释代码举例 解释 torch.max 是 PyTorch 中的一个函数&#xff0c;用于在张量中沿指定维度计算最大值。它有两种用法&#xff1a; ① 如果只提供一个输入张量&#xff0c;则返回该张量中的最大值和对应的索引。     ② 如果提供两个输入张量&#xff0c;则返回两…

最短路径——迪杰斯特拉与弗洛伊德算法

一.迪杰斯特拉算法 首先对于最短路径来说&#xff1a;从vi-vj的最短路径&#xff0c;不用非要经过所有的顶点&#xff0c;只需要找到路径最短的路径即可&#xff1b; 那么迪杰斯特拉的算法&#xff1a;其实也就与最小生成树的思想类似&#xff0c;找到较小的&#xff0c;然后…

本地文件复制到虚拟机VMWare报错 Thre was an error getting infomation about以及关于如何搭建linux虚拟机

解决方式 直接远程ssh连接&#xff0c;用ftp上传即可 关于如何搭建linux虚拟机系统 https://juejin.cn/post/7250009145915719740?searchId2024060409134616191B1350EC8E073921 需要寄快递的朋友&#xff0c;这个小程序发快递只要五块钱哦~

JavaScript 函数 声明函数 调用函数 函数的参数函数的参数

函数 函数的概念 函数&#xff1a;就是封装了一段可被调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用 函数在使用时分为两步&#xff1a;声明函数和调用函数。 声明函数 语法&#xff1a; // 声明函数 function 函数名() {// 函数体代码 } fun…

短剧APP开发,推动短剧市场的全新发展

近几年&#xff0c;短剧火爆出圈&#xff0c;迎来了爆发式增长态势&#xff0c;市场规模一跃达到了百亿元&#xff01;短剧节奏快、剧情爽、情节猎奇&#xff0c;极大地满足了用户的追剧需求&#xff0c;深受大众的喜爱。 短剧巨大的市场发展前景也衍生出了各种新的短剧发展赛…

【第三节】C/C++数据结构之栈与队列

目录 一、数据结构-栈 1.1 栈的定义 1.2 栈的 ADT (Abstract Data Type) 1.3 栈的顺序存储结构及实现 二、数据结构-队列 2.1 队列的定义 2.2 队列的 ADT 2.3 队列的顺序存储结构与实现 2.4 优先队列 2.5 各种队列异同点 一、数据结构-栈 1.1 栈的定义 栈(Stack)可…

租赁小程序基于ThinkPHP+FastAdmin+UniApp

本文来自&#xff1a;XYlease租赁小程序基于ThinkPHPFastAdminUniApp - 源码1688 应用介绍 基于ThinkPHPFastAdminUniApp开发的租赁商城小程序&#xff0c;提供用户物品租赁服务的应用程序&#xff0c;方便客户搭建各种类型的租赁场景服务。通过小程序端多角色进行平台管理&…

Mockito新手使用教程

Mockito新手使用教程 背景 实在惭愧&#xff0c;干开发这么久了&#xff0c;从来没在单元测试用过mockito&#xff0c;倒不是没写单元测试的意思&#xff0c;只是用都是SpringBootTest这类型的集成测试&#xff0c;有时候服务后台需要做mock接口&#xff0c;也是用的WireMock…

SpringBoot修真秘籍

一、古代篇 在修仙界中&#xff0c;Spring Boot 自动装配之术&#xff0c;犹如炼器炉中的异火&#xff0c;能够将繁杂的配置化作一缕轻烟&#xff0c;让修仙者在构建应用之路上&#xff0c;如履平地&#xff0c;轻松驾驭。 第一章&#xff1a;灵根觉醒——Spring Boot 的诞生 …

基于单片机的电子万年历设计

摘要: 本设计以 AT89C51 单片机为主控器,使用 DS1302 时钟芯片、DS18B20 温度芯片、LCD1602 显示模块,利用Proteus 仿真软件和 Keil 编译软件进行了基于单片机的电子万年历仿真,设计的万年历可以在液晶上显示时间,同时还具有时间校准、温度显示等功能。 关键词 :单片机…