【C++】模版(初阶)

【C++】模版(初阶)

目录

一. 函数模版

1. 格式 原理

2. 函数模版的实例化

二. 类模板


void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double& left, double& right) { double temp = left; left = right; right = temp; } void Swap(char& left, char& right) { char temp = left; left = right; right = temp; }

使用函数重载太麻烦

模具,填充不同类型,生成具体类型的代码

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础

一. 函数模版

1. 格式 原理

template<typename T1, typename T2, ......, typename Tn>
返回类型 函数名(参数列表)
{ }

typename是用来定义模板参数关键字也可以使用class,不能使用struct

模板参数作用范围:紧跟的 { }

template<typename T> // 模板参数 -- 类型 void Swap(T& left, T& right) { T temp = left; left = right; right = temp; } template<typename T1, typename T2> T1 Func (const T1& x, const T2& y) { cout << x << " " << y << endl; return x; }

int main() { int a = 0, b = 1; double c = 1.1, d = 2.2; Swap(a, b); Swap(c, d); // Date d1(1949, 10, 1), d2(2015, 7, 3); Func(1, 2); Func(1, 2.2); return 0; }

调用的是模版实例化出的函数(模板就是将本来应该我们做的重复的事情交给了编译器 )


C++库里面有。不需要写Swap,也不用写模版。直接使用

int main() { int a = 0, b = 1; double c = 1.1, d = 2.2; swap(a, b); swap(c, d); // Date d1(1949, 10, 1), d2(2015, 7, 3); return 0; }

2. 函数模版的实例化

隐式实例化:让编译器根据实参 推演模板参数的实际类型
显示实例化:在函数名后的<>中 指定模板参数的实际类型

template<typename T> T Add(const T& left, const T& right) { return left + right; } template<typename T> T* Alloc(int n) { return new T[n]; } int main() { int a1 = 10, a2 = 20; double d1 = 10.1, d2 = 20.2; cout << Add(a1, a2) << endl; cout << Add(d1, d2) << endl; // cout << Add(a1, d1) << endl; 报错:编译器无法确定T的类型 // 解决方案1:用户自己强制转换 cout << Add(a1, (int)d1) << endl; cout << Add((double)a1, d1) << endl; // 解决方案2:显示实例化 cout << Add<int>(a1, d1) << endl; cout << Add<double>(a1, d1) << endl; // 有些函数无法自动推,只能显示实例化 double* p1 = Alloc<double>(10); return 0; }

类型转换会产生临时变量(常性)。Add(a1, (int)d1) 这里不是把 d1 传给 right,所以 Add 要加 const

二. 类模板

template<class T1, class T2, ..., class Tn>
class 类模板名
{
        // 类内成员定义
};

普通类,类名和类型是一样
类模板,类名和类型不一样
类名:Stack
类型:Stack<T>

构造函数不一定用T这个参数,所以类模板都无法通过推演实例化,类都是显示实例化


template<class T> class Stack { public: Stack(int capacity = 4) { _a = new T[capacity]; _capacity = capacity; _size = 0; } void Push(const T& Date) { // CheckCapacity(); _a[_size] = Date; _size++; } ~Stack() { if (_a) { free(_a); _a = nullptr; _capacity = 0; _size = 0; } } private: T* _a; int _capacity; int _size; }; int main() { Stack<int> s1; // int Stack<double> s2; // double Stack<char> s3; // char // Stack<int, double>s4; 多个模板参数 return 0; }

类模板的声明和定义分离是别致的

类模板的声明和定义最好不要分离到 2个文件,会报错(后面讲)

template<class T> class Stack { public: Stack(int capacity = 4); void Push(const T& Date); ~Stack() { if (_a) { free(_a); _a = nullptr; _capacity = 0; _size = 0; } } private: T* _a; int _capacity; int _size; }; template<class T> Stack<T>::Stack(int capacity) { _a = new T[capacity]; _capacity = capacity; _size = 0; } template<class T> void Stack<T>::Push(const T& data) { // CheckCapacity(); _a[_size] = data; _size++; }

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注
小编会以自己学习过程中遇到的问题为素材,持续为您推送文章

Read more

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系 前言 在 OpenHarmony 鸿蒙应用追求“万物互联、全场景覆盖”的伟大进程中,屏幕尺寸的多样性(从 6 英寸手机到 12 英寸平板,再到 2D/3D 模式切换的折叠屏)是每一位 UI 开发者必须正面迎接的挑战。如何在不为每种设备重写 UI 的前提下,实现导航栏自动从“底部”平滑流转到“侧边”?如何在宽屏模式下自动开启“双栏(Master-Detail)”布局?flutter_adaptive_scaffold 作为一个由 Flutter

By Ne0inhk
在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程

在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程

在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程 什么是 OpenClaw?—— 你的本地 AI 智能体执行框架 OpenClaw 不仅仅是一个聊天机器人,而是一个功能强大的 AI 智能体执行框架。你可以把它想象成一个能自主思考、调用工具、并替你完成复杂任务的数字员工。 🧠 核心概念 * 智能体:OpenClaw 的核心大脑。它能理解你的自然语言指令,拆解任务,并决定调用哪些工具来执行。 * 网关:所有外部访问的入口。它负责处理 WebSocket 连接、管理设备配对、路由消息,是你与智能体交互的桥梁。 * 技能:智能体可调用的具体工具,比如访问文件、操作浏览器、发送消息、查询数据库等。你可以根据需要扩展技能库。 * 记忆:OpenClaw 可以存储对话历史和重要信息,实现长期记忆和上下文理解,让交互更连贯。 * 通道:连接外部聊天平台的渠道,如

By Ne0inhk
HarmonyOS6半年磨一剑 - RcIcon组件实战案例集与应用开发指南

HarmonyOS6半年磨一剑 - RcIcon组件实战案例集与应用开发指南

文章目录 * 前言 * 项目简介 * 核心特性 * 开源计划 * rchoui官网 * 文档概述 * 第一章: 基础用法实战 * 1.1 三种符号引用方式 * 1.2 应用场景 - 工具栏快速导航 * 第二章: 尺寸系统实战 * 2.1 响应式尺寸配置 * 2.2 应用场景 - 统一设计系统尺寸规范 * 第三章: 颜色系统实战 * 3.1 多彩色系配置 * 3.2 应用场景 - 状态指示系统 * 第四章: 双风格系统实战 * 4.1 线型与实底风格对比 * 4.2 应用场景 - 底部导航栏 * 第五章: 圆角系统实战 * 5.

By Ne0inhk
Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构 前言 在鸿蒙(OpenHarmony)生态迈向万物互联、涉及海量离线资源标识、蓝牙广播载荷(BLE Payload)及二维码数据极限压缩的背景下,如何生成既能保留 UUID 强随机性、又能极大缩减字符长度的唯一标识符,已成为优化存储与通讯效率的“空间必修课”。在鸿蒙设备这类强调分布式软总线传输与每一字节功耗敏感的环境下,如果应用依然直接传输长度达 36 字符的标准 UUID,由于由于有效载荷溢出,极易由于由于传输协议限制导致数据截断或多次分包带来的延迟。 我们需要一种能够实现高进制转换、支持双向编解码且具备低碰撞概率的短 ID 生成方案。 short_uuids 为 Flutter 开发者引入了将标准 UUID 转化为短格式字符串的高性能算法。它利用

By Ne0inhk