函数模板与类模板深入解析及实例

目录

函数模板

类模板

类模板成员函数的实例化

类模板的静态成员

全局特化与成员特化

缺省模板参数与数值形式的模板参数

结论


 

函数模板

函数模板允许我们编写适用于多种数据类型的通用函数。以下是函数模板的定义和使用示例:

template <typename T>
T max(T a, T b) {return a > b ? a : b;
}int main() {// 隐式实例化,T 被推断为 intstd::cout << max(3, 7) << std::endl;// 显式实例化为 double 类型std::cout << max<double>(3.5, 2.8) << std::endl;
}
类模板

类模板使得我们可以创建泛型类,适用于不同数据类型。类模板定义及使用示例:

template <typename T>
class Box {
public:T contents;void set(T item) { contents = item; }T get() const { return contents; }
};int main() {Box<int> intBox;intBox.set(42);std::cout << intBox.get() << std::endl;Box<std::string> stringBox;stringBox.set("Hello");std::cout << stringBox.get() << std::endl;
}
类模板成员函数的实例化

类模板的成员函数只有在被调用时才实例化。如果成员函数是虚函数,则会在编译期实例化所有可能的版本。

类模板的静态成员

静态成员在类模板的每个实例中都是独立的,例如:

template <typename T>
class MyClass {
public:static T sharedValue;
};// 在类外定义静态成员
template <typename T>
T MyClass<T>::sharedValue = T();int main() {MyClass<int> obj1;MyClass<double> obj2;obj1.sharedValue = 10;obj2.sharedValue = 3.14;std::cout << obj1.sharedValue << ", " << obj2.sharedValue << std::endl; // 输出: 10, 3.14
}
全局特化与成员特化
  • 全局特化:针对特定类型完全特化模板。

    template <>
    void max<char>(char a, char b) {return a > b ? a : b;
    }

    成员特化:特化类模板中的某个成员函数。

    template <>
    std::string Box<std::string>::get() const {return "Specialized get for string";
    }

 

缺省模板参数与数值形式的模板参数
  • 缺省模板参数允许在不提供某些类型参数时使用默认值。

    1template <typename T = int>
    2class DefaultTemplate {
    3};
    4
    5DefaultTemplate<> defaultInt; // 使用默认类型 int
  • 数值形式的模板参数允许使用整数等作为模板参数。

    template <typename T, size_t N = 80>
    class Array {T data[N];
    };Array<double, 100> largeArray; // 使用自定义大小

    结论

    函数模板和类模板是C++中泛型编程的核心,它们极大地增强了代码的复用性和灵活性。通过实例化,我们可以为不同数据类型生成定制化的函数和类,同时通过特化处理特殊情况,确保了泛型代码的适用范围和效率。理解模板的二次编译、隐式推断、重载规则以及特化技巧,对于高效地使用模板至关重要。

 

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

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

相关文章

【Docker】——安装镜像和创建容器,详解镜像和Dockerfile

前言 在此记录一下docker的镜像和容器的相关注意事项 前提条件&#xff1a;已安装Docker、显卡驱动等基础配置 1. 安装镜像 网上有太多的教程&#xff0c;但是都没说如何下载官方的镜像&#xff0c;在这里记录一下&#xff0c;使用docker安装官方的镜像 Docker Hub的官方链…

mke2fs -- 比mkfs.ext4艺术成分更高

mke2fs 介绍 mke2fs 是一个用于创建 ext2/ext3/ext4 文件系统的工具&#xff0c;是 mkfs.ext2, mkfs.ext3, mkfs.ext4 的底层工具。它提供了丰富的选项和参数&#xff0c;可以对文件系统进行详细的配置和优化。下面是 mke2fs 的详细讲解&#xff0c;包括其主要功能、常用选项及…

如何在MobaXterm上创建以及删除自己的用户和目录?

一、创建用户的两种命令 adduser和useradd命令在Linux系统中用于创建新的用户账户&#xff0c;但它们之间存在一些关键的区别&#xff0c;主要涉及它们的交互性和默认行为&#xff1a; sudo adduser newuser sudo useradd newuser 交互性: adduser: 这个命令通常提供更多的…

内外网映射访问内网服务器

如果本地有公网ip&#xff0c;比如连接的宽带有公网ip&#xff0c;可以直接通过路由配置转发就行了&#xff0c;如果本地没有公网ip&#xff0c;那就需要通过下面这种方式来访问内网服务器了。 1&#xff1a;首先内网服务器需要连接外网&#xff0c;可以通过网线或者WiFi都可以…

小林图解系统-二.硬件结构 2.4CPU缓存一致性

CPU Cache的数据写入 CPU和内存的访问性能越差越大&#xff0c;于是在CPU内部嵌入CPU Cache(高速缓存)。 CPU Cache由Cache Line组成&#xff0c;Cache Line由头标志Tag数据块Data Block组成。 如果数据写入Cache&#xff0c;内存和Cache相对应的数据将不同&#xff0c;需要…

Redis-五种数据结构之列表(ziplist、quicklist)

列表 文章目录 列表压缩列表-ziplistziplist 定义级联更新 快速列表-quicklistquicklistNode 定义quicklist 定义quicklist常用操作其他操作quicklist 相对于普通链表优点quick应用场景在redis 中使用quicklist 列表数据类型可以存储一组按插入顺序排序的字符串&#xff0c;他很…

昇思大模型学习·第一天

mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…

Linux搭建Minio单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Linux搭建Minio单机环境 ⏱️ 创作时间&#xff1a; 2024年06月19日 目…

Linux网络命令:网络速度测试工具 speedtest-cli 详解

目录 一、概述 二、安装 speedtest-cli 1、在基于 Debian 的系统上安装 2、在基于 Red Hat 的系统上安装 三、命令语法 1、基本命令语法 2、查看帮助 3、常用选项 四、 speedtest-cli使用示例 1. 基本测试 2. 列出所有可用的服务器 3. 指定服务器进行测试 …

C语言—数据在内存中的存储

1.整数在内存中的存储 文章回顾&#xff08;C语言—操作符详解&#xff09; 整数的2进制表示方式有三种&#xff0c;即原码、反码和补码。 有符号的整数&#xff0c;三种表示方式均有符号位和数值位两部分&#xff0c;符号位都是用0表示“正”&#xff0c;用1表示“负”&…

数据库 | 试卷四

1.数据库系统的特点是 数据共享、减少数据冗余、数据独立、避免了数据不一致和加强了数据保护 2.关系模型的数据结构是二维表结构 3.聚簇索引 cluster index 4. 这里B&#xff0c;C都是主属性&#xff0c;所以B->C不是非主属性对码的部分函数依赖 候选键&#xff08;AC&a…

复利(Compound Interest)是什么?中英双语介绍

中文版 复利&#xff08;Compound Interest&#xff09;深入介绍 1. 什么是复利&#xff1f; 复利&#xff08;Compound Interest&#xff09;&#xff0c;也称为“利滚利”&#xff0c;是指利息不仅会根据本金计算&#xff0c;还会根据已经累积的利息计算。这种方式可以让投…

极端天气频繁之下,新能源风力发电风机巡检建设智能化超高清化趋势明显

这个6月&#xff0c;中央气象台连发7天高温预警&#xff0c;全国多地气温超40度&#xff0c;全国出现40℃以上高温的范围持续增加&#xff0c;6个国家站日最高气温突破6月极值。极端热浪不仅冲向中国&#xff0c;几乎北半球的所有地区&#xff0c;也同样被这股热浪影响。 随着…

LabVIEW共享变量

共享变量简介 LabVIEW​为​创建​分布​式​应用使用​共享​变量​可以简化​此类​应用的编程。​ 借助​共享​变量&#xff0c;​您​可以​在​同​一个​程序​框​图​的​不同​循环​之间​或者网络上​的​不同VI之间​共享​数据。与LabVIEW中的许多​其他数据​共…

htb_Editorial

hack the book Editorial 端口扫描 80 22 目录扫描 /upload 是一个上传book information的页面 其中最顶上有一个可以上传书本封面的地方&#xff0c;可以从本地上传&#xff0c;也可以从远程下载 这里可能涉及ssrf和本地文件上传&#xff0c;逐一尝试 随便上传一个图片…

idea搜索只显示100条、如何修改idea搜索的条数

文章目录 一、老版本的IDEA&#xff08;2021年之前的版本&#xff09;二、新版本的IDEA&#xff08;2021年及之后的版本&#xff09;2.1、方式一2.2、方式二 如下图&#xff1a;idea搜索的时候默认只显示100条 要解决IDEA搜索只显示100条的问题&#xff0c;可以通过修改搜索结…

腾讯云入选Gartner®边缘分发平台代表厂商,为企业数字化升级保驾护航

刚刚获悉&#xff0c;国际信息技术研究和分析机构Gartner正式发布《Market Guide for Edge Distribution Platforms》报告&#xff0c;腾讯云凭借边缘安全加速平台EdgeOne成功入选代表厂商。相信这意味着腾讯云EdgeOne领先的技术、产品和实践能力得到了认可。 万物互联时代&am…

【UML用户指南】-19-对基本行为建模-用例图

目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程&#xff1a; 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…

进入docker容器内部操作mysql数据库

文章目录 1、查询docker容器2、进入mysql容器内部3、连接mysql数据库4、查询mysql所有的数据库5、使用某个数据库6、展示数据库中所有的表7、查询某张表8、断开mysql9、退出mysql容器 1、查询docker容器 [rootlocalhost ~]# docker ps CONTAINER ID IMAGE …

Java 序列化与反序列化

Java 序列化是一种将对象的状态转换为字节流的机制&#xff0c;以便可以将该对象的状态保存到文件、数据库或通过网络传输。在反序列化过程中&#xff0c;这些字节流可以被重新转换为对象。序列化主要用于以下几种情况&#xff1a; 持久化存储&#xff1a;将对象的状态保存到文…