C++之模板(一)

1、为什么需要模板

将具有相同逻辑的一段代码提供一份模板,当我们需要处理不同类型的时候,可以通过数据类型当作参数来传递,从而实例化出对应类型的处理版本。

2、模板的定义

也是一种静态多态。

3、模板的分类

4、函数模板

5、函数模板的使用

通常我们把模板的实现放在.h文件中,不放在.cpp文件中,因为编译的时候需要去推导模板函数,这个时候如果放在cpp文件中,则实例化的时候找不到实现。

#include <iostream>
using namespace std;template <typename T>
const T& max(const T& a, const T& b)
{return a < b ? b : a;
}// 编译过后会生成模板函数,但是不可见
//const int& max(const int& a, const int& b)
//{
//    return a < b ? b : a;
//}class Test
{
public:friend bool operator<(const Test& t1, const Test& t2){return true;}
};int main() {cout << ::max(5.5, 6.6) << endl;  // 编译器根据参数自动推导出模板函数cout << ::max('a', 'c') << endl;Test t1;Test t2;::max(t1, t2);return 0;
}

6、函数模板特化

当你传入的是指针的类型的话,则比较的是指针的大小,而不是指针指向内容的大小,这样不符合我们预期,所以需要特化。特化表示我们组要给特殊的类型做特殊的操作。

没加特化前:

template <typename T>
const T& max(const T& a, const T& b)
{return a < b ? b : a;
}class Test
{
public:friend bool operator<(const Test& t1, const Test& t2){return true;}
};int main() {const char* str1 = "zzz";const char* str2 = "aaa";cout << ::max(str1, str2) << endl;return 0;
}// 输出
aaa

加上特化后:

#include <iostream>
using namespace std;#include <cstring>template <typename T>
const T& max(const T& a, const T& b)
{return a < b ? b : a;
}// 函数模板特化
template <>
const char* const& max(const char* const& a, const char* const& b)
{return strcmp(a, b) < 0 ? b : a;
}class Test
{
public:friend bool operator<(const Test& t1, const Test& t2){return true;}
};int main() {const char* str1 = "zzz";const char* str2 = "aaa";cout << ::max(str1, str2) << endl;return 0;
}// 输出
zzz

7、重载函数模板

模板特化还算是模板函数,但是非模板函数重载,已经不算模板函数。

#include <iostream>
using namespace std;#include <cstring>template <typename T>
const T& max(const T& a, const T& b)
{return a < b ? b : a;
}// 函数模板重载
template <typename T>
const T& max(const T& a, const T& b, const T& c)
{return ::max(a, b) < c ? c : ::max(a, b);
}// 非模板函数重载
const int& max(const int& a, const int& b)
{cout << "non template" << endl;return a < b ? b : a;
}// 函数模板特化
template <>
const char* const& max(const char* const& a, const char* const& b)
{return strcmp(a, b) < 0 ? b : a;
}int main() {cout << ::max(1, 5, 3) << endl;cout << ::max('a', 100) << endl;  // 非函数模板中将字符隐式转化成整型cout << ::max(94, 100) << endl;cout << ::max<>(94, 100) << endl;  // 自动推导max(const int& a, const int& b)cout << ::max<int>(97, 100) << endl;  // 显示指定模板函数(加上<>表示要使用模板函数)cout << ::max<int>('a', 100) << endl;return 0;
}// 输出
5
non template
100
non template
100
100
100
100

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

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

相关文章

-------------------------面试散文-----------------------------------

问题1&#xff1a;vue中动态引入图片&#xff0c;为什么使用require&#xff1f; 回答&#xff1a;因为动态添加的src 编译过后的文件地址和被编译过后的资源文件地址不一致&#xff0c;从而导致无法访问题 而使用require 返回的就是资源文件被编译后的文件地址&#xff0c;从…

Aeron:Aeron Agent

Aeron Agent 是一个 Java 代理&#xff0c;用于提供 Aeron、Aeron Archive 和 Aeron Cluster 中发生的运行时低级日志信息。这些日志语句包括从高级管理员事件到大容量数据帧事件。 在调试 Archive 和 Cluster 问题时&#xff0c;Aeron Agent 的日志数据尤其有用。 一、Availab…

本地无法连接linux上的MariaDB数据库

问题&#xff1a;本地用DBeaver无法连接服务器上的MariaDB数据库 &#xff1f; 测试1&#xff1a;在cmd中ping 服务器IP&#xff0c;看是否能ping通&#xff0c;能ping通&#xff0c;没有问题 测试2&#xff1a;在cmd中telnet 服务器IP 端口&#xff0c;看是否能访问&#xf…

常见的Redis使用问题及解决方案

目录 1. 缓存穿透 1.1 解决方案 2. 缓存击穿 2.1 解决方案 3. 缓存雪崩 3.1 概念图及问题描述 ​编辑3.2 解决方案 4. 分布式锁 4.1 概念 4.2 基于redis来实现分布式锁 4.3 用idea来操作一遍redis分布式锁 4.4 分布式上锁的情况下&#xff0c;锁释放了服务器b中的锁…

JAVA学习笔记DAY8——Spring_AOC Spring-tx

文章目录 AOC概述Spring-aop 配置举例快速实现获取切点详细信息在增强方法中获取目标方法的信息返回结果异常信息 切点表示式语法统一切点管理环绕通知 Around切面增强优先级CGlib生效场景注解方式aop总结xml 方式配置aop Spring AOP 对获取Bean的影响Spring 声明性事务概念事务…

多态深度剖析

前言 继承是多态的基础&#xff0c; 如果对于继承的知识还不够了解&#xff0c; 可以去阅读上一篇文章 继承深度剖析 基本概念与定义 概念&#xff1a; 通俗来说&#xff0c;就是多种形态。具体点就是去完成某个行为&#xff0c; 当不同的对象去完成时会产生出不同的状…

docker使用auth登录

配置config.json文件 vim ~/.docker/config.json 格式&#xff1a; {"auths":{"registry.digitalocean.com":{"auth":"xxx"}} }QA:配置不生效&#xff0c;去掉默认的一些其他配置&#xff0c;只保留auth部分 直接使用auth登录 docke…

淘宝商品信息一网打尽!深入探索item_get接口的高效应用

淘宝item_get接口技术详解 一、引言 淘宝的开放平台为开发者提供了丰富的API接口&#xff0c;其中item_get接口是用于获取淘宝商品详情的常用接口。通过这个接口&#xff0c;开发者可以获取到商品的标题、价格、描述、图片等关键信息&#xff0c;进而实现商品数据的抓取、分析…

如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法

&#x1f6e0;️ 如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错&#xff1a;找不到匹配的 host key 算法 摘要&#xff1a; 本文将带领大家深入学习如何解决 Xshell 使用 SSH 连接 Linux 服务器时报错“找不到匹配的 host key 算法”的问题。通过详细的操作步骤和代码案…

第12章:集合框架

第12章&#xff1a;随堂复习与企业真题&#xff08;集合框架&#xff09; 一、随堂复习 1. 数组存储数据方面的特点和弊端 数组存储多个数据方面的特点&#xff1a;> 数组一旦初始化&#xff0c;其长度就是确定的。> 数组中的多个元素是依次紧密排列的&#xff0c;有序的…

05-5.4.3 树和森林的遍历

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

Shopee虾皮API:获取商家店铺商品列表

一、平台介绍 Shopee&#xff0c;作为东南亚及中国台湾地区领先的电商平台&#xff0c;为卖家提供了一个便捷、高效的销售渠道。作为卖家&#xff0c;能够将自己的商品展示在Shopee平台上&#xff0c;并通过平台的流量和工具&#xff0c;将商品销售给更多的潜在买家。 为了帮…

系统架构设计师 - 操作系统(2)

操作系统 操作系统&#xff08;5-6分&#xff09;文件管理绝对路径与相对路径 ★索引文件 ★★★位示图 ★ 存储管理段页式存储 ★★★页式存储段式存储段页式存储&#xff08;了解&#xff09; 页面置换算法 ★ 微内核操作系统嵌入式操作系统 ★★★ 大家好呀&#xff01;我是…

数据库课设-中小企业工资管理系统

一、效果展示 二、后端代码 import string import random from flask import Flask, render_template, request, jsonify, redirect, session import pymysql from flask_cors import CORS import time import schedule from datetime import datetime import threading from …

HK1-BOX X3刷UBUNTU 24.04,并开启WIFI

端午刚好有点时间&#xff0c;顺便把改完散热的HK1-BOX刷了个最新OC版的UBUNTU 24&#xff0c;这里记录下操作的步骤&#xff1a; 准备材料 HK1-BOX S905X3&#xff1a;注意X4的不行固件没匹配的。建议先改完散热&#xff0c;不然作为7X24小时的机器长时间高温还是很伤硬件的…

Web前端项目-拼图游戏【附源码】

拼图游戏 拼图游戏是一种经典的益智游戏&#xff0c;通过HTML、CSS和JavaScript等前端技术的综合运用来实现&#xff1b;拼图游戏可以锻炼玩家的观察能力、空间认知能力和逻辑思维能力。游戏开始时&#xff0c;一张图片会被切割成多个小块&#xff0c;并以随机顺序排列在游戏区…

CMOS图像传感器——列噪声(CFPN)去除

目前CMOS 图像传感器系统中列共用结构应用最为广泛,在该结构中,虽然像素曝光均匀,但是由于列输出系统处理属性的变动,对于不同列,像素的输出是不均匀的。因此,基于列的CMOS 图像传感器表现出垂直条纹固定模式噪声(CFPN),从而降低了图像的质量。由于人眼 的关系,CFPN …

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

kotlin 中的字符串

一、字符类访问 1、字符串的访问跟js一样&#xff0c;可以使用索引来访问或者直接循环。 fun main() {val a: String "2024"// 方式一&#xff1a;for (item in a) {println(item) // 输出每一个字符}// 方式二&#xff1a;println("${a[0]}, ${a[1]}, ${a[2…