【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

Gemma 3模型:Google 开源新星,大语言模型未来探索

Gemma 3模型:Google 开源新星,大语言模型未来探索

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、快速发展的AI世界:为何关注Gemma 3? 2、Gemma 模型的背景:Google 的开源承诺 二、Gemma 3 基础:什么是 Gemma? 1、Gemma 模型的诞生和设计理念 2、Gemma 模型的优势与特点 三、Gemma 3 技术深度解析 1、Gemma 3 的架构 2、模型训练与优化 3、不同尺寸 Gemma 模型对比 一、引言 1、快速发展的AI世界:为何关注Gemma

By Ne0inhk
开源 MaxKB 深度解读

开源 MaxKB 深度解读

引言:AI 落地的现实困境与 MaxKB 的解决方案   在人工智能渗透各行各业的今天,多数企业仍面临技术门槛高、部署成本高、迭代周期长的现实问题。MaxKB(全称 "Max Knowledge Brain")作为一款企业级智能体平台,以开源易用、可逐步拓展的特性,为这些问题提供了可行的解决路径。该平台在 GitHub 累计获得 19K+ Stars,安装量超 50 万次,日均下载量逾 1000 次,已覆盖 30 余个行业的 1000 余家企业。本文结合官方技术方案、实操截图与应用案例,从技术内核、实操落地、行业价值三大维度,对其进行全面拆解。 一、技术内核拆解:从 RAG 到 Agent 的全栈架构 1.

By Ne0inhk

git: worktree命令介绍和使用

文章目录 * 一、基本概念 * 二、常用命令 * 三、使用示例 * 1. 创建一个新的 worktree * 2. 查看所有 worktree * 3. 删除 worktree * 四、注意事项 * 五、典型使用场景 * 六、兼容性 git worktree 是 Git 提供的一个强大功能,允许你在同一个 Git 仓库中同时检出多个分支,而无需克隆多个副本。每个工作树(worktree)都有独立的工作目录、暂存区和 HEAD,但共享同一个 .git 仓库对象数据库,从而节省磁盘空间和提升效率。 https://git-scm.com/docs/git-worktree/zh_HANS-CN 一、基本概念 * 主工作树(

By Ne0inhk
腾讯版“免部署小龙虾“WorkBuddy,平替开源OpenClaw,无需抢购Mac Mini,所有电脑均可部署安装!0元养虾!

腾讯版“免部署小龙虾“WorkBuddy,平替开源OpenClaw,无需抢购Mac Mini,所有电脑均可部署安装!0元养虾!

前言:AI Agent时代来了,你还在为"养虾"发愁? 最近,开源AI智能体OpenClaw(被网友亲切称为"小龙虾")火遍全网,GitHub星标数超过24.8万,登顶星标榜第一!它能自动盯盘、写周报、修代码,甚至操作你的电脑完成复杂任务,堪称"数字员工"。 然而,想养这只"虾"可不容易: 需要抢购Mac Mini(M1/M2芯片,内存16GB起步) 要手动配置Docker、API密钥、网络环境 命令行操作复杂,普通用户往往耗费数小时仍无法成功运行 好消息来了!腾讯云正式推出WorkBuddy—— 腾讯版"免部署小龙虾",完全兼容OpenClaw技能,但无需配置、

By Ne0inhk