【高质量C++/C总结3】泛型编程——Template模板

C++/Qt高薪项目实战:工业级应用开发核心技术解析 C++作为高性能系统编程语言,凭借其零成本抽象和底层硬件控制能力,在需要极致性能的领域占据核心地位。其内存管理、模板元编程等特性使开发者能够构建高效、稳定的复杂系统。Qt框架则提供了强大的跨平台GUI开发能力,通过信号槽机制、模型/视图架构等设计,极大地提升了桌面和嵌入式应用的开发效率。两者的结合在工业自动化、汽车电子、医疗器械等高壁垒行业展现出巨大技术价值,能够满足复杂业务逻辑、高性能计算和严苛稳定性要求。本文以工业监控系统为例,深入剖析如何运用现代C++特性与Qt框架精髓,解决多线程数据同步、实时可视化 阅读详情

说在开始:

我提炼了《C++ Primer》、《侯捷C++》、《高质量程序设计指南——C/C++语言》等资料中的重要部分,并总结成此博文。其中涉及到许多我个人对C++的理解,如若有不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

内容介绍

Template是C++泛型编程中非常重要的一环,Template常用在泛型类和函数中。在C++标准库中也经常看到Template的身影。可以说,Template是一个优秀的C++框架中重要的一环,例如那些优秀的C++框架,OpenGL,OpenCV,STL等等。Template是一非常大的话题,该篇博文只会让您对Template产生基本的认识,要想熟练掌握,需要修读更多的书籍和资料。

那么Template为什么会这么重要?首先是一个具体的案例,接着在分析一下algorithm中的max源码,这样可以对Template有更深的体会。

在开始之前我们思考一个我们经常遇到的情况,看一下以下代码。

int a = 2, b = 3;
int c = max(a, b);
float af = 2.0f, bf = 3.0f;
float cf = max(af, bf);

stack(int a) s1;//存放int类型数据的栈
stack(float b) s2;//存放float类型数据的栈

1、要想实现以上功能需要写几个max函数?

2、要想实现以上功能需要写几个类?

在没有函数模板时,想必只能通过此种方式完成:

int max(int a, int b)
{
	if (a > b) { return a; }else { return b; }
}
float max(float a, float b)
{
	if (a > b) { return a; }else { return b; }
}
class stack
{
    public:
        stack(int a)
}
class stack2
{
    public:
        stack(float a)
}

在写程序时,一定要注意,当频繁使用ctrl+c和ctrl+v时往往都不是啥好事。上面的代码会有以下几种问题:(1)代码较长,抒写时耗费时间。(2)需求改变时,修改不方便,这里不在多提怎么不方便了。每个函数都需要修改一遍,傻子都不喜欢做吧。

模板就是为了解决此种情况提出的。

使用方法

以以下此段代码为例。

template <typename T>
T  add(T  a, T  b) {
	return a + b;
}

T可以是任何名称,不过我观察大部分C++开源库中都使用的是T。这里T你可以想象成是一个类型,与int相似。

函数模板

//FunctionTemplate.cpp
template <typename T>
T const& add(T const& a, T const& b) {//创建函数模板
	return a + b;
}
int main() {
	int i1 = add(1, 2);
	float f2 = add(3.3f, 4.2f);
	double d3 = add(2,2);
	std::cout << i1 << std::endl;
	std::cout << f2 << std::endl;
	std::cout << d3 << std::endl;
	std::cin.get();
}

通过此种方式,add函数可接受任何类型的参数。

类模板

//ClassTemplate.h
#ifndef CLASSTEMPLATE
#define CLASSTEMPLATE
template <class T>
class ClassTemplate
{
public:
	ClassTemplate(T const& widthIn, T const& heightIn)
		: width(widthIn), height(heightIn)
	{
	}
	T const& CalculateArea();
private:
	T width;
	T height;
};

template <class T>
T const&  ClassTemplate<T>::CalculateArea() {
	return width * height;
}
#endif // !CLASSTEMPLATE
//main.cpp
#include <iostream>
#include "ClassTemplate.h"
using namespace std;
int main() {
	ClassTemplate<int> s1(1,2);
	ClassTemplate<float> s2(1.0f, 2.0f);
	int area=s1.CalculateArea();
	float areaf = s2.CalculateArea();
	cout << "计算出的int面积是" << area<< "计算出的float面积是" << areaf << endl;
	std::cin.get();
}

在main.cpp代码ClassTemplate s1(1,2);ClassTemplate s2(1.0f, 2.0f);中可以看出,接收了不同的参数。当然你可以使用此种方式构造栈。

typename和class的区别

以上两种方式,使用typename和class是没有区别的,两种方式都可以定义模板。

template <typename T>
template <class T>

但是有一种情况就需要区别对待typename和class了。

C++11模板编程实战:可变参数、类型推导与编译期计算 模板是C++泛型编程的核心机制,它通过在编译期生成类型特定的代码,实现代码复用与类型安全。其原理基于编译器的实例化机制,根据提供的类型参数生成具体代码。这项技术的核心价值在于编写高度通用、高性能且类型安全的库组件,广泛应用于容器、算法库、工厂模式等场景。C++11标准对模板进行了重大革新,引入了可变参数模板,允许函数和类接受任意数量的模板参数,极大地增强了表达能力;同时强化了类型推导能力,通过auto和decltype关键字简化了复杂类型的声明。这些改进使得开发者能够更自然地编写如std::tuple、st 阅读详情

相关推荐

VC++编程范例集锦:从Win32到MFC/ATL的实战指南与项目配置详解

在Windows桌面开发领域,Visual C++(VC++)作为核心开发工具,其技术栈涵盖从底层的Win32 API到经典的MFC、ATL框架,再到现代技术集成。理解其编程模型与项目配置原理,是构建稳定、高效桌面应用的基础。通过系统化的范例代码,开发者可以掌握窗口创建、消息循环、GDI绘图、多线程同步等关键技术,并深入MFC的文档-视图架构与双缓冲渲染,以及ATL的COM组件开发。这些技术价值在于能够直接解决实际开发中的配置复杂性、内存管理及性能优化等工程难题,广泛应用于商业软件、系统工具及行业专用程序的

cnvdkx2837的博客 388

C++高级面试题:什么是 C++ 中的函数模板(Function Templates)?

C++ 中的函数模板(Function Templates)是一种通用编程技术,允许在编写函数时使用参数化的类型或值。函数模板可以自动生成一系列特定类型或值的函数定义,从而实现代码的复用和泛化。// 函数体在上面的示例中,template 表示这是一个函数模板,并且 T 是一个模板参数,可以是任何类型。函数 myFunction 接受一个参数 arg,其类型是模板参数 T。函数模板的特点包括:泛型编程:函数模板允许编写一次函数定义,然后用不同的数据类型调用它,从而实现通用性和泛化性。

qiuyehuanghun的博客 589

C++集成Spire.XLS实战:高效处理Excel报表与数据填充

在C++开发中,处理Excel文件是常见的需求,尤其是在桌面应用、后台服务和工业控制软件领域。传统方法如COM接口依赖重、跨平台差,而CSV格式则无法保留公式和样式。因此,集成专业的Excel处理库成为提升开发效率的关键。Spire.XLS for C++作为一个商业组件,提供了不依赖微软Office的解决方案,支持创建、读取、编辑和转换Excel文档,其核心价值在于高效的数据处理和报表生成能力。通过环境配置、核心功能实战(如样式设置、公式计算)以及性能优化技巧,开发者可以在纯C++环境中实现复杂Excel

weixin_30235225的博客 337

详解函数模板

C++的一种编程思想称为泛型编程,主要利用的技术就是模板。

zhangyubo325的博客 5209

基于AI与本地知识库的游戏动态攻略生成系统设计与实现

在游戏开发与玩家支持领域,如何高效、精准地提供游戏指引是一个经典挑战。传统静态攻略存在更新滞后、形式单一的问题。其核心解决思路在于将结构化的游戏数据与智能化的内容生成相结合。从技术原理上看,这通常涉及实时数据感知、信息检索与自然语言生成等多个环节。其技术价值在于能够实现内容的实时化、个性化与自动化生产,显著提升玩家体验与社区运营效率。典型的应用场景包括游戏内的实时任务指引、复杂谜题提示以及战斗策略推荐等。本文聚焦于利用ChatGPT等大语言模型与本地向量数据库技术,构建一个混合智能系统。该系统通过游戏API

weixin_30570101的博客 370

RK3588平台-ES8388音频驱动调试与设备树配置实战

本文详细解析了在RK3588平台上调试ES8388音频驱动的实战过程。内容涵盖Linux音频驱动的三层架构(Machine、Platform、Codec),并重点提供了设备树(DTS)的完整配置示例,包括I2C节点、声卡节点及音频路由设置。文章还分享了驱动加载验证、amixer调试命令以及常见问题(如无声、变调)的排查思路,旨在帮助开发者快速完成RK3588与ES8388的音频系统集成。

mango的博客 806

【函数模板的使用】

泛型编程:用一个标志来表示类型,不是实际的类型。独立于任何特定类型的编程,c++的一个部分。函数模板克服了C语言解决类似问题时使用大量不通函数名表示相关功能。克服了宏定义不能进行参数类型检查的弊端。克服了C++函数重载用相应函数名字重写几个函数的繁琐。以上就是今天要讲的内容,本文仅仅简单介绍了函数模板的使用,而函数模板提供了大量能使我们快速便捷地处理数据的函数和方法,提高了我们编程的效率。

weixin_42453675的博客 1326

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 707

模板篇

模板篇 前言:模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 函数模板 函数模板使用场景 当函数功能相同,但要求其类型参数支持所以基本类型或自定义类型时 函数模板定义形式 由以下三部分组成: 模板说明 + 函数定义 + 函数模板调用 1.模板说明 template <类型形式参数表> 类型形式参数的形式: typename T1, typename T2,...,typename Tn class T1, class T2,..., class

qq_44013216的博客 317

配置VS Code使用Linux服务器上的Matlab

0、需求 Linux服务器上安装有Matlab 无图形界面,只能使用命令行工具,编辑文件不方便 1、VS Code插件安装 在扩展商店中搜索matlab,会出现Matlab Extension Pack,里面有整理好的matlab扩展 这里只安装了第一排的三个扩展 2、设置(Windows、Mac的设置类似,只是不同系统的文件路径不同) 安装好扩展,重启VS Code后,进行设置 打开:文件→首选项→设置(或快捷键ctrl+,),搜索matlab,结果如下图所示;直接打开完整json配置文件(图

赵彬的博客 5008

正确使用 SGLang 和 vLLM 中为 Qwen3 开启工具调用能力的完整指南

本文介绍了在vLLM和SGLang框架中部署Qwen3大模型并启用工具调用功能的方法。主要内容包括:vLLM中需配置--tool-call-parser hermes和--enable-auto-tool-choice参数,SGLang中使用--tool-call-parser qwen25参数;提供了完整的部署命令示例和测试工具调用的curl请求模板;对比了两个框架的关键参数差异;总结了常见问题解决方案和性能优化建议。正确配置后,Qwen3能够充分发挥其外部工具调用能力,为AI应用开发提供支持。

Ven%的博客 4446

C++/C++11中变长参数的使用

C++/C++11中变长参数的使用

网络资源是无限的 3万+

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 397

Gemma-4-12B-Coder-Fable5-Composer2.5-4bit:Apple Silicon专属4-bit量化AI编码模型震撼发布 [特殊字符]

在AI编程助手领域迎来重大突破!今天,我们激动地宣布Gemma-4-12B-Coder-Fable5-Composer2.5-4bit的正式发布——这是一款专为Apple Silicon Mac设计的4-bit量化AI编码模型,为开发者带来前所未有的本地编程体验!这款AI编码模型不仅保留了原版Gemma-4的强大推理能力,还通过先进的4-bit量化技术大幅降低了内存占用,让12B参数的大模型能在个

gitblog_01091的博客 674

【unity游戏开发之InputSystem——01】通过写代码监听InputSystem输入(基于unity6开发介绍)

通过写代码监听InputSystem输入(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4890

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 115

编程语言难度排名:从Python到Lisp,10种语言学习成本全解析

编程语言是开发者与计算机沟通的核心工具,其设计哲学和语法特性决定了学习曲线和应用场景。从原理上看,语言的难度通常由语法复杂度、概念抽象层级、生态成熟度等维度综合决定。在技术价值层面,易学的语言能快速实现想法、降低入门门槛,而复杂的语言则提供了更强的控制力、性能或独特的编程范式,适用于系统级开发、高性能计算或学术研究。常见的应用场景包括Web开发、数据分析、移动应用、操作系统、嵌入式系统等。本文基于‘编程语言难度测量仪’思维模型,对Python、JavaScript、Java、Go、C#、C++、Rust、H

weixin_33806914的博客 411

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Day2-完美转发与引用折叠:让模板“原封不动“地传递参数

在现代C++中,我们经常编写泛型包装函数——工厂函数、适配器、委托构造等。这些函数的核心职责是"透明地"将参数传递给下游函数。然而,参数传递过程中存在一个根本性的信息丢失问题:值类别(value category)在按值传递时会被"降级"。考虑一个工厂函数的典型场景: 当我们按值传递参数给 构造器时:但如果 构造器内部按值接收,它实际上无法区分传入的是左值还是右值——因为参数本身已经是复制/移动后的结果。这就是参数传递困境。Day 1我们学习了移动语义的核心: 作为右值引用可以让编译器选择"窃取"而非"

如风逝去 379

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[C++]《C++ 开发避坑指南:从基础类型到高级构造的常见问题与解决方案》

C89/C90 标准中没有内置的 `bool` 类型,通常使用 `int` 配合宏定义来模拟。C99 标准引入了 `stdbool.h`,提供了 `bool`、`true`、`false`。public:// 构造函数使用初始化列表cout << "姓名:" << name << ", 年龄:" << age<< ", 身高:" << height << "m, 学生:" << (isStudent?

qq_55948352的博客 402

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Clang 20与C++20下fmt库编译兼容性深度解析与解决方案

C++20标准引入了现代化的格式化库std::format,为类型安全的字符串格式化提供了官方解决方案。其核心原理是通过编译期格式字符串解析和类型检查,结合模板元编程技术,在保证类型安全的同时实现高性能格式化输出。这一特性显著提升了C++在日志系统、文本序列化及用户界面生成等场景下的开发效率与代码健壮性。在实际工程实践中,当开发者将项目升级到C++20并使用前沿编译器如Clang 20时,常会遇到与流行格式化库fmt的兼容性问题。这些问题通常源于编译器对C++20新特性的实现差异、库版本的条件编译逻辑以及项

weixin_34341117的博客 507

PUBG-Logitech:基于图像识别的智能压枪系统技术深度解析

PUBG-Logitech项目通过创新的图像识别技术与罗技鼠标宏结合,实现了无需修改游戏文件的智能压枪解决方案。该系统采用C++/QT/OpenCV技术栈,通过实时截图识别背包界面武器文字,动态调整压枪参数,为FPS游戏玩家提供了安全、高效的后坐力补偿方案。 ## 传统压枪方案的技术局限性 ### 内存读取方案的安全风险 传统的游戏辅助工具通常采用内存读取技术,直接访问游戏进程内存数据来获取

gitblog_01165的博客 929

用Markdown驱动AI系统提示词:Nanobot项目解析与工程实践

在AI应用开发中,系统提示词(System Prompt)是定义模型行为边界和能力的核心指令。传统上,开发者常将复杂的提示词以长字符串形式硬编码在代码中,导致可读性差、维护困难、难以复用和版本控制。为解决这一痛点,一种创新的工程实践应运而生:将人类友好的Markdown文档作为“源代码”,通过编译思想将其转换为AI可执行的优化指令。这种方法借鉴了软件工程中的模块化、变量替换和条件逻辑等概念,实现了提示词的结构化管理。通过引入抽象语法树(AST)解析、语义转换和上下文管理等技术,开发者可以像管理代码一样管理提

weixin_30908941的博客 390

C++AI编译错误自动修复神器-告别手动Debug的终极方案

在日常 C++ 开发中,编译错误是最频繁遇到的障碍之一。一个中等规模的项目在重构期间,一次 可能产生数十甚至上百条错误信息。这些错误往往具有级联效应——一个头文件的拼写错误可能导致下游十几个翻译单元同时报错,而真正需要修改的地方只有一处。传统的工作流是: 这个循环对于经验丰富的开发者来说尚可接受,但对于以下场景则效率极低:优势:局限:本项目最适合以下场景:阅读

weixin_48053866的博客 279

behaviac深度解析:腾讯游戏AI框架的设计哲学与实战指南

想象一下这样的场景:你的游戏角色需要做出复杂的决策——敌人来袭时是战斗还是逃跑?资源有限时如何分配?团队协作中如何协调行动?传统硬编码的AI逻辑在面对这些复杂场景时往往力不从心,而behaviac正是为解决这些问题而生的**游戏AI开发框架**。作为腾讯开源的**行为树框架**,它不仅仅是一个工具,更是一种设计哲学的体现——将AI逻辑可视化、数据化、模块化。 ## 设计哲学:为什么behavia

gitblog_01001的博客 500
上一篇: 【OpenGL编程】虚化模糊场景(类似摄像机的人像效果)
下一篇: 【高质量C++/C总结9】复数类complex解析
尹豆(douysu)
博客等级 码龄9年 151粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值