C/C++基础知识复习(28)

1. 什么是模板特化和偏特化?

在 C++ 中,模板特化偏特化是两种针对模板类型的高级用法,用于在某些特定情况下对模板的行为进行特殊处理。

模板特化(Full Specialization)

模板特化是对模板的某个具体类型提供专门的实现。这种特化完全替代了泛型模板的实现,适用于特定的类型。

模板偏特化(Partial Specialization)

模板偏特化是为一类特定的模板参数提供部分特定的实现,而不是对某个特定类型进行完全特化。偏特化只适用于类模板,而函数模板不能偏特化。


2. 如何进行模板特化和偏特化?

模板特化

语法: 对泛型模板进行全特化,提供专门的实现。

#include <iostream> 
using namespace std; 
// 通用模板 
template <typename T> class Example { 
public: void display() {cout << "Generic template\n"; 
} 
}; // 对 `int` 类型进行特化 template <> class Example<int> {public: void display() {cout << "Specialized template for int\n"; 
} }; 
int main() { 
Example<double> e1; 
// 使用通用模板 
e1.display(); 
// 输出: Generic template Example<int> e2; 
// 使用特化版本 e2.display(); 
// 输出: Specialized template for int return 0; 
}

注意

  • 模板特化需要明确指定参数类型,如 Example<int>
  • 通用模板仍适用于未特化的其他类型。

模板偏特化

模板偏特化允许我们为模板的某些类型模式提供特定实现。只能用于类模板

语法: 对模板的部分参数或模式进行特定处理。

#include <iostream> using namespace std; 
// 通用模板 template <typename T1, typename T2> class Example {public: void display() {cout << "Generic template with two types\n";
} 
}; 
// 偏特化:当两个参数是相同类型时的特殊实现 
template <typename T> class Example<T, T> {public: void display() {cout << "Partial specialization for same types\n"; 
}}; // 偏特化:第一个参数是 `int` 时的特殊实现 template <typename T> class Example<int, T> { public: void display() {cout << "Partial specialization with int as the first parameter\n"; 
} 
}; 
int main() {Example<double, double> e1; // 偏特化(两个相同类型) 
e1.display(); // 输出: Partial specialization for same types Example<int, double> e2; 
// 偏特化(第一个是 int)e2.display(); 
// 输出: Partial specialization with int as the first parameter Example<float, double> e3; 
// 通用模板e3.display(); 
// 输出: Generic template with two types return 0; 
}

注意

  • 偏特化的匹配优先级高于通用模板,但低于完全特化。
  • 偏特化只能在类模板中实现,函数模板不支持偏特化。

额外知识点

函数模板特化

函数模板没有偏特化,但可以通过函数重载显式特化实现类似效果。

显式特化:

#include <iostream>using namespace std; 
// 通用函数模板 
template <typename T> void display(T val) {cout << "Generic function: " << val << endl; 
} // 特化:专门为 `int` 类型实现 
template <> void display(int val) {cout << "Specialized function for int: " << val << endl; 
} 
int main() {display(42); 
// 输出: Specialized function for int: 42 display(3.14); 
// 输出: Generic function: 3.14 return 0; 
}
偏特化与 std::enable_if

现代 C++ 中,可以通过 SFINAE(如 std::enable_if)替代部分偏特化的需求。例如,针对某些类型条件定制模板行为。

#include <iostream> 
#include <type_traits> using namespace std; 
// 通用模板 
template <typename T, typename Enable = void> class Example {public: void display() 
{ 
cout << "Generic template\n";} 
}; 
// 偏特化:当 T 是整数类型时启用 
template <typename T> class Example<T, typename enable_if<is_integral<T>::value>::type> 
{public: void display() 
{ 
cout << "Specialized for integral types\n"; 
} 
}; 
int main() {Example<int> e1; 
// 匹配整数类型 e1.display(); 
// 输出: Specialized for integral types Example<double> e2; 
// 匹配通用模板 e2.display(); 
// 输出: Generic template return 0; }

总结

  1. 模板特化:针对特定类型提供完全定制的实现。
  2. 模板偏特化:为模板参数的某些模式定制部分实现,仅适用于类模板。
  3. 函数模板通过显式特化或函数重载实现类似偏特化行为。
  4. 在现代 C++ 中,SFINAE 和 std::enable_if 提供了更多灵活性以实现模板行为定制。

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

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

相关文章

【2024 Optimal Control 16-745】Julia语法

Lecture 2 θ和它的导数符号是通过 Julia 中的变量命名方式实现的 变量 θ 的输入&#xff1a; 在 Julia 中&#xff0c;θ 是一个合法的变量名&#xff0c;就像普通的字母 x 或 y 一样。要输入 θ&#xff0c;可以使用以下方法&#xff1a; 在 Jupyter Notebook 或 Julia REP…

Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着儿童娱乐与教育需求的…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

stm32如何接收舵机的控制信号(而不是控制舵机)

看到很多如何stm32用pwm信号控制舵机的文章,老生常谈了 我来写一个stm32接收pwm信号的例子 ,这个pwm信号是用来控制舵机的 背景: 我需要接收航模接收机的,用来控制舵机的pwm信号, 得到这个信号后,做其他事情. 初版代码 pwm.h#ifndef _pwm_H #define _pwm_H#include "s…

RK3588 HDMI2.1电路参考设计原理

RK3588是瑞芯微电子&#xff08;Rockchip&#xff09;旗下的一款高性能应用处理器芯片&#xff0c;采用了ARM的big.LITTLE架构&#xff0c;结合了四个高性能的Cortex-A76核心和四个高效能的Cortex-A55核心。 big.LITTLE技术通过结合高性能的“大核”&#xff08;big cores&…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的&#xff0c;那么创建完毕rdd以后他的分区数量是多少&#xff1f; 从hdfs读取文件的方式是最正规的方式&#xff0c;我们通过计算原理可以推出blk的个数和分区数量是一致的&#xff0c;本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…

艾体宝干货丨差异解读:IT 和 OT 网络的数据包和网络分析

IT 网络&#xff08;传统网络&#xff09; IT 网络是现代计算的支柱&#xff0c;为数据交换、通信和处理提供了基础设施。典型应用包括 办公网络数据中心云服务互联网连接 这些网络依靠 TCP/IP、DNS 和 HTTP 等标准协议来促进设备之间的通信。通信路径可能随时发生变化&…

AOC显示器915Sw按键失灵维修记

大家好&#xff0c;我是 程序员码递夫 今天给大家分享的是自己维修老古董AOC液晶显示器按键失灵的的过程&#xff0c;实属DIY记录。 1、引子 家里有台老古董的19寸AOC液晶显示器&#xff08;型号915Sw&#xff09;, 一直作为我的副显示器陪伴着左右&#xff0c;显示还正常&a…

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…

【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization&#xff0c;简称NGO&#xff09;是一种新兴的智能优化算法&#xff0c;灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽&#xff0c;广泛分布于北…

戴尔 AI Factory 上的 Agentic RAG 搭载 NVIDIA 和 Elasticsearch 向量数据库

作者&#xff1a;来自 Elastic Hemant Malik, Dell Team 我们很高兴与戴尔合作撰写白皮书《戴尔 AI Factory with NVIDIA 上的 Agentic RAG》。白皮书是一份供开发人员参考的设计文档&#xff0c;概述了实施 Agentic 检索增强生成 (retrieval augmented generation - RAG) 应用…

第十六届蓝桥杯模拟赛(第一期)-Python

本次模拟赛我认为涉及到的知识点&#xff1a; 分解质因数 Python的datetime库 位运算 简单dp 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

数据库中的增删改查操作、聚合函数、内置函数、分组查询

数据库中的增删改查操作、聚合函数、内置函数、分组查询 CRUD简介Create 新增语法示例单⾏数据全列插⼊单⾏数据指定列插⼊多⾏数据指定列插⼊ Retrieve 检索语法⽰例构造数据 Select全列查询指定列查询查询字段为表达式为查询结果指定别名语法⽰例 结果去重查询 Order by 排序…

SpringBoot项目部署到云服务器全流程

文章目录 一、前期准备&#xff08;一&#xff09;云服务器选择&#xff08;二&#xff09;本地环境准备&#xff08;三&#xff09;数据库准备&#xff08;若项目需要&#xff09; 二、服务器配置&#xff08;一&#xff09;获取服务器信息&#xff08;二&#xff09;重置实例…

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

如何用通义灵码助力项目开发 | OceanBase obdiag 项目共建实践

本文来自 obdiag 项目共建的用户分享 一、背景 我的数据库探索之旅始于OceanBase。作为一位满怀好奇心的DBA&#xff0c;我内心始终怀揣着对数据库内部运作机制的无尽向往。开源如同一把钥匙&#xff0c;为我们这些求知欲旺盛的“好奇猫”解锁了通往新知的神秘大门。在众多分布…

网络安全,文明上网(2)加强网络安全意识

前言 在当今这个数据驱动的时代&#xff0c;对网络安全保持高度警觉已经成为每个人的基本要求。 网络安全意识&#xff1a;信息时代的必备防御 网络已经成为我们生活中不可或缺的一部分&#xff0c;信息技术的快速进步使得我们对网络的依赖性日益增强。然而&#xff0c;网络安全…

实时数据研发 | Flink技术栈

下周要开始接触一些实时的内容了&#xff0c;想来是很幸运的&#xff0c;这是我在新人培训上提问过技术前辈的问题&#xff1a;“想学习实时相关技术&#xff0c;但是部门没有类似的需求&#xff0c;应该如何提升&#xff1f;”当时师姐说先用心去学&#xff0c;然后向主管证明…

Spark SQL 之 QueryStage

ExchangeQueryStageExec ExchangeQueryStageExec 分为两种