什么是 C++ 中的模板特化和偏特化?如何进行模板特化和偏特化?

embedded/2024/11/24 9:09:49/

参考文献:C++模板全特化,偏特化(局部特化)_c++ 偏特化-CSDN博客

                  C++ 模板特化与偏特化_模板偏特化-CSDN博客

                

模板特化

定义

模板特化是指为特定的模板参数类型提供一个专门的实现。当使用这个特定类型时,编译器会优先选择这个特化版本,而不是通用的模板定义。模板特化有时也称之为模板的具体化,分为函数模板特化和类模板特化。

函数模板特化

假设我们有一个简单的模板函数,用于比较两个值是否相等

template<typename T>
bool isEqual(T a, T b) {return a == b;
}

但是当处理指针类型时,上述代码比较的是指针的值(地址),如果我们想要比较指针所指向的值是否相等,就可以对指针类型进行特化

#include<iostream>
using namespace std;
template<typename T>
bool isEqual(T a, T b) {return a == b;
}template<>
bool isEqual<int*>(int* a, int* b) {return *a == *b;
}
int main() {int a = 2;int b = 2;cout << isEqual(&a, &b) << endl;
}

类模板特化

#include<iostream>
using namespace std;
template<typename T,typename U>
class A {
public:T first;U second;A(T t,U u):first(t),second(u){}void printf_A() {cout << first << " " << second << endl;}
};template<>
class A<int, int> {
public:int first;int second;A(int t, int u) :first(t), second(u) {}void printf_A() {cout << first << " " << second << endl;}
};
int main() {A<string, string> a("张三", "李四");//使用普通类模板a.printf_A();A<int, int> b(1, 2);//使用特化的类模板b.printf_A();}

模板偏特化

定义

模板偏特化是一种对模板部分参数进行特化的机制。与模板特化不同的是,它不是为所有模板参数指定具体类型,而是只对其中的一部分参数进行特殊化处理。这种方式在处理具有多个模板参数的模板(特别是类模板)时非常有用,可以根据部分参数的特性来提供不同的模板实现,从而更好地适应复杂的类型组合。

偏特化从两个方面说起,一个是从模板参数数量上,一个是从模板参数的范围上

数量上:

#include <iostream>using namespace std;
template<typename T, typename U, typename W>
struct TCP
{void testfunc(){cout << "TCP普通版本" << endl;}
};template<typename U> 
struct TCP<int, U, double>
{void testfunc(){cout << "TCP int, U, double 偏特化版本" << endl;}
};
int main()
{TCP<int, double, int> tcp;tcp.testfunc();TCP<int, double, double> tcp1;tcp1.testfunc();
}

范围上:

#include <iostream>using namespace std;
template<typename T>
struct TC1
{void testfunc(){cout << "TC1普通版本" << endl;}
};
//模板参数范围上的特化版本。
template<typename T>
struct TC1<const T>//const T的特化版本
{void testfunc(){cout << "TC1 const T的特化版本" << endl;}
};


http://www.ppmy.cn/embedded/140084.html

相关文章

Unity图形学之着色器之间传递参数

1.初始化 struct&#xff1a; UNITY_INITIALIZE_OUTPUT&#xff08;type,name&#xff09; Type: struct 名字 Name :变量的名字 struct Input{float2 uv_MainTex;float3 myColor;};half _Glossiness;half _Metallic;fixed4 _Color;void MyVertx(inout appdata_base v,out I…

Node.js笔记(三)局域网聊天室构建1

目标 用户与服务端建立通信&#xff0c;服务端能检测到用户端的连接信息 代码 JS部分<chatroom.js> const express require(express) const http require(http) const {Server} require(socket.io)const app express() const se…

WPF里面的C1FlexGrid表格控件添加RadioButton单选

如下&#xff0c;普通表单不会这么麻烦&#xff0c;我这边还根据数据控制了是否可以编辑 <c1:Column Header"评审结果" Binding"{Binding ReviewResult}" ColumnName"ReviewResult" Width"200"> <c1:Column.CellTemplate&g…

旋转向量v和旋转矩阵R

旋转向量v和旋转矩阵R 旋转向量 v 和旋转矩阵 R 是三维空间中描述旋转的两种数学表示方式。两者的关系通过 Rodrigues 公式 建立。 1. 旋转向量v 2. 旋转矩阵R 3. 旋转向量v和旋转矩阵R的关系 两者通过 Rodrigues 公式 和特殊的矩阵运算互相转换&#xff1a; 4. 代码示例 1…

React项目设置不同模式(开发development与生产production)——cross-env与env-cmd详解

在React中使用Create React App&#xff08;CRA&#xff09;构建项目时&#xff0c;可以通过以下步骤来开启生产模式&#xff1a; 一、安装Create React App&#xff08;如尚未安装&#xff09; 确保已经安装了Node.js和npm。Node.js通常自带npm包管理器。全局安装Create Rea…

iic协议

IIC&#xff08;Inter-Integrated Circuit&#xff09;协议&#xff0c;也被称为I2C协议&#xff0c;是一种由荷兰的PHILIPS公司&#xff08;现为NXP半导体公司&#xff09;开发的简单、高效的通信协议。以下是关于IIC协议的详细介绍&#xff1a; 一、IIC协议概述 定义&#…

BEV:显示相机视角转换-----FastBEV/IPM与LSS

一、背景 BEV方案中&#xff0c;将图像视角转换到BEV视角的方法对模型性能影响较大&#xff0c;FastBEV的速度较快&#xff0c;但投影效果上限不高&#xff0c;LSS投影上限较高&#xff0c;但速度较慢 &#xff08;耗时相对较高&#xff09;。是否有折中的方案&#xff0c;在耗…

设计模式-创建型-工厂模式

1.概念 由多个不同的工厂来替我们完成生产对象的操作&#xff0c;不同的工厂生产不同的对象 2.作用 不再会违背OCP原则&#xff0c;要添加新的产品类会相应添加对应的工厂类&#xff0c;不会修改到已有工厂的代码。 调用者不再关心产品的创建&#xff0c;实现职责分离 3.应…