当前位置: 首页 > news >正文

【QT】模板如何使用

01函数模板

  • 定义:函数模板允许你编写一个通用的函数,该函数可以处理不同的数据类型,而不需要为每种类型都编写一个单独的函数。
  • 语法

cpp

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

02说明

  • template <typename T>声明这是一个模板,typename关键字用于定义模板参数T,也可以使用class关键字,二者在这里含义相同。
  • 函数add接受两个类型为T的参数ab,并返回它们的和。T可以在函数定义中作为普通类型使用。

03使用

cpp

int main() { int result1 = add(3, 5); // 自动推导T为int double result2 = add(3.5, 5.5); // 自动推导T为double return 0; }
  • 显式实例化:有时编译器无法自动推导模板参数类型,或者你想明确指定类型,可以进行显式实例化。

cpp

int main() { int result = add<int>(3, 5); // 显式指定T为int return 0; }

001类模板

  • 定义:类模板用于创建通用的类,其成员函数和数据成员的类型可以是模板参数。
  • 语法

cpp

template <typename T> class Stack { private: T* data; int top; int capacity; public: Stack(int size) : capacity(size), top(-1) { data = new T[capacity]; } ~Stack() { delete[] data; } void push(T value) { if (top == capacity - 1) { // 处理栈满情况,可扩容 return; } data[++top] = value; } T pop() { if (top == -1) { // 处理栈空情况 return T(); } return data[top--]; } };

002说明

  • 类模板Stack定义了一个栈结构,其数据成员data是类型为T的指针,用于存储栈中的元素。
  • 构造函数和析构函数分别负责分配和释放内存。pushpop成员函数用于操作栈。

003使用

cpp

int main() { Stack<int> intStack(5); intStack.push(10); int value = intStack.pop(); Stack<double> doubleStack(3); doubleStack.push(3.14); double dValue = doubleStack.pop(); return 0; }

0001模板特化

  • 函数模板特化
    • 定义:当通用的函数模板不能满足特定类型的需求时,可以对函数模板进行特化。
    • 语法

cpp

template <> std::string add<std::string>(std::string a, std::string b) { return a + b; }
  • 说明
    • template <>表示这是一个模板特化。
    • 对于std::string类型,add函数的行为是字符串拼接,不同于通用模板中数值类型的加法操作。
  • 类模板特化
    • 定义:同样,类模板也可以进行特化,以满足特定类型的特殊需求。
    • 语法

cpp

template <> class Stack<bool> { private: bool* data; int top; int capacity; public: Stack(int size) : capacity(size), top(-1) { data = new bool[capacity]; } ~Stack() { delete[] data; } void push(bool value) { if (top == capacity - 1) { // 处理栈满情况,可扩容 return; } data[++top] = value; } bool pop() { if (top == -1) { // 处理栈空情况 return false; } return data[top--]; } };
  • 说明
    • 这里对Stack类模板进行了特化,专门处理bool类型。可以根据bool类型的特点,对类的实现进行优化,比如在存储bool类型时可以采用更紧凑的存储方式等(这里为了简单示例,仅展示了基本结构)。
  1. 模板的局限性与注意事项
    • 模板实例化位置:模板定义通常放在头文件中,因为编译器需要在使用模板的地方知道模板的完整定义,以便进行实例化。
    • 错误检查延迟:模板的错误检查在实例化时进行,而不是在模板定义时。这意味着一些语法错误可能在代码编写时不会被立即发现,直到模板被实例化。
    • 模板膨胀:过多使用模板可能导致代码膨胀,因为编译器会为每个实例化的模板生成一份代码。在设计模板时,要尽量避免不必要的模板实例化。
http://www.jsqmd.com/news/1099028/

相关文章:

  • 2026年7月零代码网站搭建与企业无代码建站工具测评:谁更适合你,
  • MySQL实战指南:从SQL语法到索引优化与生产环境调优
  • 计算机毕业设计之基于SSM的校园共享单车管理系统设计与实现
  • 速来薅羊毛!8元免费得
  • Claude Code(15):CodeGraph - 给 AI 装上代码地图,少读文件、少烧 Token
  • VR-Reversal:3分钟将VR视频变成普通播放器可看的2D影片
  • UE 移动端 CPU、GPU、内存问题怎么归因:一套性能分析方法
  • RAG 真正让人头疼的地方,从来不是“搭不起来”
  • 抖音无水印下载技术解析:从录屏到原生文件获取的革命
  • 反射使用详解
  • 管人这件事:三流领导靠罚,二流靠制度,一流靠方法
  • Dify实战教程:从零搭建企业级AI应用,掌握低代码开发与工作流设计
  • Paperxie 课程论文智能写作:填空式创作,轻松搞定期末结课论文
  • AI 创业融资策略:从技术壁垒到资本叙事的结构化拆解
  • SPI机制:服务扩展的核心技术
  • HarmonyOS Floating TabBar:悬浮底部导航栏实战(HdsTabs + MiniBar + 模糊材质全指南)
  • 用WSL(Windows Subsystem for Linux :适用于Linux的windows子系统) 在 Windows 系统上运行你最喜爱的linux工具、使用工具,应用工具和工作流
  • openeuler/skills用户指南:从安装到优化的10个实用技巧
  • 时钟控制器和TIM、DMA、ADC、UART控制器
  • 如何为PPT添加编辑限制密码?图文详解设置与移除方法
  • 从大鼠到山羊,从肌腱细胞到肌腱干细胞——云克隆原代肌腱细胞全系列,为肌腱研究提供了一套完整的“细胞工具”
  • 2026年6月全球零代码网站制作工具盘点测评!不会编程也能做
  • 上下文工程 vs 提示词工程:决定 Agent 上限的,是前者不是你天天调的那玩意
  • 2026年企业如何选择、落地智能呼叫中心?功能拆解+部署指南
  • 手机AI Agent系统级集成实战:从架构到代码的完整指南
  • 别再凭感觉选RC了!用这个比率设计法,5分钟搞定Sallen-Key低通滤波器
  • C#工业相机软件的自动升级与远程维护系统实现
  • 阿里云盘Refresh Token获取:3分钟扫码授权完整指南
  • Unsloth量化实战:消费级显卡(12GB)跑通8B大模型
  • 从“能签”到“智签”,从工具到中枢,行业正在经历深层重构