C++ 入门12:模板(Template)

详解 C++中的模板 这篇文章主要介绍C++中的模板。模板是一系列相关函数的模型或样板,这些函数的源代码形式相同,只是所针对的数据类型不同。在开发过程中,我们经常遇到这种情况,有两个或者两个以上的函数,其功能是相同的,仅仅是数据类型的不同。上面的三个函数都实现了对数据的加法运算,唯一不同的是参数类型不同。这样的函数可以采用函数模板实现简便化。类模板是通过引入模板参数来定义类的。在类模板的声明中,使用 template 关键字标识模板类型参数,然后在类的定义中可以使用这些模板参数,就像使用普通的数据类型一样。 阅读详情

往期回顾:

C++ 入门09:友元函数和友元类-优快云博客

C++ 入门10:继承和派生类-优快云博客

C++ 入门11:虚函数和多态-优快云博客


 C++ 入门12:模板(Template)

一、前言

在前面文章的学习中,我们掌握了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类,以及虚函数和多态。今天,我们将学习 C++ 中的模板。模板是 C++ 中的一种强大的功能,它使得我们可以编写通用的代码。

二、模板(Template)

2.1、 什么是模板?

模板是C++中引入的一个非常强大的特性,它提供了一种机制来创建泛型编程的框架。通过使用模板,程序员可以编写与类型无关的代码,这意味着相同的代码结构可以用于多种不同的数据类型,而无需为每种数据类型重写代码。模板极大地提高了代码的重用性、灵活性和可维护性。模板主要分为两大类:函数模板和类模板。

2.2、 函数模板

(1)什么是函数模板?

函数模板是一种能够编写一个函数定义,该函数可以与多种数据类型一起工作的技术。在定义函数模板时,程序员可以定义一个或多个模板参数来表示数据类型,这些参数在函数被实例化时会被具体的类型所替换。通过这种方式,函数模板可以处理不同类型的数据,而无需为每种数据类型编写单独的函数。

(2)声明和定义函数模板

函数模板的声明和定义与普通函数的声明和定义类似,但需要在函数声明前加上template<typename T>(或template<class T>,两者在大多数情况下可以互换使用)来引入模板参数。这里的T是一个占位符,代表将要被替换的数据类型。

语法:

template <typename T>
返回类型 函数名(参数列表) {
    // 函数体
}

其中,typename T 是模板参数,表示数据类型。 

示例:

我们定义一个函数模板 maxValue,用于返回两个值中的较大者。

#include <iostream>
using namespace std;

template <typename T>
T maxValue(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << "Max of 3 and 7: " << maxValue(3, 7) << endl;
    cout << "Max of 3.5 and 7.2: " << maxValue(3.5, 7.2) << endl;
    cout << "Max of 'a' and 'z': " << maxValue('a', 'z') << endl;

    return 0;
}

在这个示例中,我们定义了一个函数模板 maxValue,它可以处理任意类型的数据。在 main 函数中,我们分别调用了 maxValue 函数,传入整数、浮点数和字符类型的数据。

2.3、 类模板

(1)什么是类模板?

类模板与函数模板类似,但它允许程序员定义一种可以处理多种数据类型的类。在定义类模板时,可以使用模板参数来表示类成员变量和成员函数所使用的数据类型。这使得类模板能够创建出具有相同操作但操作不同类型数据的对象。

(2)声明和定义类模板

类模板的声明和定义方式与普通类相似,但同样需要在类声明前加上template<typename T>(或template<class T>)来引入模板参数。

语法:

template <typename T>
class 类名 {
public:
    // 成员变量
    // 成员函数
};

示例:

我们定义一个类模板 Box,用于存储一个值,并提供获取和设置该值的函数。

#include <iostream>
using namespace std;

template <typename T>
class Box {
private:
    T value;

public:
    Box(T v) : value(v) {}

    void setValue(T v) {
        value = v;
    }

    T getValue() {
        return value;
    }
};

int main() {
    Box<int> intBox(123);
    Box<double> doubleBox(45.67);

    cout << "Integer Box: " << intBox.getValue() << endl;
    cout << "Double Box: " << doubleBox.getValue() << endl;

    intBox.setValue(456);
    doubleBox.setValue(89.01);

    cout << "Updated Integer Box: " << intBox.getValue() << endl;
    cout << "Updated Double Box: " << doubleBox.getValue() << endl;

    return 0;
}

在这个示例中,我们定义了一个类模板 Box,它可以存储任意类型的数据。在 main 函数中,我们分别创建了存储整数和浮点数的 Box 对象,并调用了 getValue 和 setValue 函数。

2.4、 模板特化

(1)什么是模板特化?

模板特化是一种为模板参数提供特定类型实现的机制。在某些情况下,我们可能希望对某些特定类型的数据进行特殊处理,而不是使用模板的通用实现。这时,我们就可以通过模板特化来为这些特定类型提供定制化的实现。

模板特化可以是完全特化,也可以是偏特化。完全特化是指为模板的所有模板参数指定具体类型;而偏特化则是指为模板的部分模板参数指定具体类型,同时保留其他模板参数的通用性。

示例:

我们定义一个类模板 Printer,用于打印不同类型的数据。对于 char* 类型,我们希望打印字符串而不是字符指针,因此我们使用模板特化进行处理。

#include <iostream>
using namespace std;

template <typename T>
class Printer {
public:
    void print(T value) {
        cout << "Value: " << value << endl;
    }
};

// 对 char* 类型进行特化
template <>
class Printer<char*> {
public:
    void print(char* value) {
        cout << "String: " << value << endl;
    }
};

int main() {
    Printer<int> intPrinter;
    Printer<double> doublePrinter;
    Printer<char*> stringPrinter;

    intPrinter.print(123);
    doublePrinter.print(45.67);
    stringPrinter.print("Hello, World!");

    return 0;
}

在这个示例中,我们定义了一个类模板 Printer,用于打印不同类型的数据。对于 char* 类型,我们使用模板特化进行处理,以打印字符串。


以上就是 C++ 程序的模板的基础知识点了。包括函数模板、类模板和模板特化。模板是 C++ 中的一种强大的功能,它使得我们可以编写通用的代码。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

C++模板详解:泛型编程、模板原理、非类型模板参数、模板特化、分离编译 泛型编程、模板原理、非类型模板参数、模板特化、分离编译 阅读详情

相关推荐

C++ Template 基础篇(二):类模板

Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第二部分。 类模板定义 类模板 类模板中的成员函数模板 类模板Tips 类模板中的static成员 类模板成员函数实例化 类模板别名 特化与偏特化 类模板的特化与偏特化 类模板成员特化 类模板定义类模板也是公共逻辑的抽象,通常用来作为容器(例如:vector)或者行为

lezardfu的专栏 2万+

C++模板(template)详解

原因是在链接过程中,编译器找不到模板函数的定义,因为在使用模板时,.h文件中的模板的声明知晓了模板参数的类型,但在.cpp文件中的模版不知道,所以.cpp中模板的定义没法实例化,也就没法在编译阶段生成一份经过实例化的具体的代码,这将导致程序在链接阶段找不到模板函数的实现而报链接错误。这样一来,在调用Add函数的时候,其本质上是调用了上面的经过实例化的模板函数,这样做的好处就是,程序员就可以不用对每一种数据类型都去实现对应的函数,大大提高了效率,而且只实现这么一份通用的模板函数可以使其更易于维护。

2301_81261654的博客 1万+

C++类模板

类模板 1.3.1 类模板语法 类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。 语法: template<typename T> 类 解释: template — 声明创建模板 typename — 表面其后面的符号是一种数据类型,可以用class代替 T — 通用的数据类型,名称可以替换,通常为大写字母 示例: #include <string> //类模板 template<class NameType, c

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1897

C++编程语言中模板(template)介绍

泛型编程是一种代码编写方式,通过使用泛型编程,可以编写出独立于任何特定类型的代码。模板是泛型编程的基础,是创建泛型函数或类的蓝图(公式)。C++的STL(Standard Template Library)容器及其迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如vector,我们可以定义许多包含不同类型元素的vector,比如:“vector ”或“vector ”。C++的模板包括函数模板和类模板。

liitdar的博客 8963

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 545

别再为下载速度发愁了!手把手教你给qBittorrent/Transmission添加最新可用Tracker(附2024年实测地址清单)

本文提供2024年BT下载加速实战指南,详细解析Tracker工作原理与速度瓶颈,手把手教你为qBittorrent/Transmission添加最新可用Tracker,并附实测地址清单。通过优化配置和精选Tracker列表,显著提升下载速度和稳定性,解决连接延迟和peer数量限制问题。

weixin_28481133的博客 1265

C++之模板<template>

目录🌈前言🌸 模板🌷1、泛型编程🌺2、函数模板🍀2.1、函数模板的概念🍁2.2、函数模板的格式🍂 2.3、函数模板的原理🍌2.4、函数模板的实例化🍃 2.5、模板参数的匹配原则🍒 3、类模板🍕 3.1、类模板的概念🍔 3.2、类模板的格式🍒3.3、类模板的实例化🍖 4、非类型模板参数🍗 5、模板的特化🍙5.1、特化的概念🍛5.2、函数模板的特化🍜5.3、类模板特化🍝 5.3.1、类模板全特化🍞 5.3.2、类模板的偏特化🍟6、模板的分离编译🎆6.1、 什么是分离编译🎆6. 2、解决方法🎇7、模板总结 🌈前

gangaue的博客 1万+

【迁移学习】域对抗迁移网络 DANN

Domain-Adversarial Training of Neural Networks

这个博客太懒了什么都没说 8417

C++模板——template

目录1. 模板2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6 声明定义分离3. 类模板3.1 类模板格式3.2 类模板的实例化3.3 类模板中函数放在类外进行定义时4. 模板分离编译4.1 什么是分离编译4.2 模板的分离编译5. 缺省值,返回值6. 总结...

原来45的博客 4万+

保姆级教程:在瑞芯微RV1126B上部署轻量化YOLOv8,实现端侧实时目标检测

本文详细介绍了在瑞芯微RV1126B芯片上部署轻量化YOLOv8模型的完整流程,包括开发环境搭建、模型训练优化、量化转换及嵌入式部署。通过利用RV1126B的3TOPS NPU算力和AI-ISP特性,实现端侧实时目标检测,提升边缘AI应用的性能和效率。

weixin_30329623的博客 268

基于深度学习的茶叶等级检测识别系统:YOLOv8 + UI界面 + 数据集完整实现

随着深度学习技术的不断进步,基于计算机视觉的茶叶等级检测系统可以大大提高检测效率,提供客观一致的评估标准。本系统将利用YOLOv8进行茶叶等级的检测与识别,通过图形用户界面(UI)实现与用户的交互,提供茶叶等级分类的实时反馈。本文将详细介绍如何使用YOLOv8结合UI界面,建立一个完整的茶叶等级检测与识别系统,包括数据集的准备、模型的训练、UI的设计及完整的代码实现。本系统的目标是通过深度学习技术,结合YOLOv8模型和图形用户界面(UI),实现对茶叶等级的自动化检测与识别。

YOLO 972

C++中 模板Template的使用

1、在c++Template中非常多地方都用到了typename与class这两个关键字,并且好像能够替换,是不是这两个关键字全然一样呢? 答:class用于定义类,在模板引入c++后,最初定义模板的方法为:template,这里class关键字表明T是一个类型。后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字。它的作用同class一样表明后面的符号为一个类型。这样在定义模板的时候就能够使用以下的方式了: template.在模板定义语法中关键字class与ty

顺其自然~专栏 1万+

数据挖掘在人力资源分析中的实战案例

在当今竞争激烈的商业环境中,人力资源管理对于企业的成功至关重要。有效的人力资源管理能够提高员工绩效、降低员工流失率、优化人才招聘等。而数据挖掘技术为人力资源管理提供了强大的工具,通过对大量人力资源数据的分析,可以发现潜在的规律和模式,为企业的决策提供有力支持。本文的目的是通过实际案例展示数据挖掘在人力资源分析中的具体应用,涵盖员工绩效预测、人才招聘筛选、员工流失分析等多个方面。通过详细的案例分析,帮助读者理解数据挖掘技术在人力资源管理中的实际操作和应用价值。

移动开发前沿的博客 489

【C++】模板template

一文教你学会模板

Lin5200000的博客 3492

YOLOv8独家原创改进:原创自研 | 创新自研CPMS注意力,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM

自研CPMS,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3798

2025年下半年网络规划设计师综合知识真题及答案解析

1983年,ARPANet完成技术转型,对此后的 Internet发展全关重要,这一转型是指( ) A.电路交换转向分组交换 B.商业化转型 C.民用化转型 D.从 NCP 协议转向 TCP/IP 答案:D 解析:ARPANet 最初使用 NCP (Network Control Protocol)协议进行主机问通信。1983年1月1日,ARPANet 正式切换到TCP/IP 协议族,为后续Internet的发展奠定了统一协议基础。

鹿鸣天涯 931

C++的模板template

本文介绍了C++中的模板,包括类模板和函数模板的原理,以及为何引入模板以减少代码重复。通过实例化展示了如何根据不同类型自动适应模板。C++中的模板分为类模板和函数模板,编译器不会自动为其生成具体的可执行代码。只有在具体执行时,编译器才帮助其实例化。

Jacker优快云的博客 1622

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ 类模板(template)详解

1.类模板的使用 1.1为什么需要类模板 类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,我们可以通过如下面语句声明了一个类模板: template <typename T> class A { public: A(T t){ this->t = t; } T& getT(){ return t; } public: T t; }; 1.2类模板定义 类模板由模板说明和类说明构成 模板说...

qq_54169998的博客 6万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C++模板】——template

当我们写一个栈的时候,但不知道用户要用栈来存储什么样的数据,这时候我们就可以使用类模板来创建一个栈,可以通过用户传的类型,自动生成相应的类。// 类模板 template < class T > class Stack {public :_size = 0;T * _array;int _size;// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表 template < class T > Stack < T > :: Stack(size_t capacity) {

小小小智_x0__0x_的博客 1216

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【C++】模板中template、typename的非常见用法

模板是指:C++程序设计中采用类型作为参数的程序设计,用于支持通用程序设计。C++的标准库提供许多有用的函数大多结合了模板的观念,如STL、IO Stream等。在模型的声明中,最最最常见的用法就是:值得注意的是:模板在编译的时候并不知道这个T是什么类型,只有在实例化的时候才能够知晓。因此,这会导致在模板较复杂的时候,可能会产生很多意想不到的理解上的歧义。为了规避这种歧义性,typename和template在某些特定的情况下,需要点明。这就是它们的非常见用法。

Yngz_Miao的博客 1万+

掌握C++模板编程:Cpp-Primer-5th-Exercises第16章实战指南

C++模板编程是C++ Primer第5版第16章的核心内容,也是提升C++编程能力的关键技能。通过Cpp-Primer-5th-Exercises项目中的实战练习,你将系统掌握模板类、函数模板、模板特化等核心概念,轻松应对复杂的泛型编程挑战。 ## 为什么模板编程是C++开发者的必备技能 🚀 模板是C++实现泛型编程的基础,它允许你编写与类型无关的代码,大幅提高代码复用性和灵活性。在标准库

gitblog_00320的博客 936

[ C++ ] C++之模板template

C++ 模板template初阶,函数模板,类模板

优快云博客 1535

深入解析template,掌握C++模板的精髓!

模板是 C++ 中最强大和最广泛使用的方法之一,允许我们编写通用程序。它允许我们定义泛型函数和类。它促进了泛型编程,不需要为不同的参数编写相同的函数或方法。可以将模板定义为创建泛型类和函数的蓝图。C++ 模板背后的想法很简单。将数据类型作为参数传递,不需要为不同的数据类型编写相同的代码。在 C++ 的模板中使用两个关键字——template和typename来实现泛型编程。注意:typename 关键字始终可以替换为class关键字。像迭代器这样的库容器。

Lion_Long的博客 2283

godot-cpp模板项目实战:基于godot-cpp-template快速开发插件

你还在为Godot引擎C++插件开发的繁琐配置而烦恼吗?本文将带你基于godot-cpp-template模板项目,通过实例演示从环境搭建到插件发布的完整流程,让你1小时内即可上手开发专业级Godot插件。读完本文你将掌握:C++类与Godot脚本的绑定方法、跨平台编译配置、插件资源管理以及调试技巧。 ## 项目结构概览 godot-cpp模板项目采用模块化设计,核心目录结构如下: ``` ...

gitblog_01138的博客 1155

C++模板(template)使用介绍

1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{return(x>y)?x:y ;}//函数2.float max( float x

chenchen410的专栏 4万+
上一篇: C++ 入门11:虚函数和多态
下一篇: C++ 入门13:异常处理
从一的
博客等级 码龄5年 1995粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值