C++全特化与偏特化

2023-11-03

全特化

全特化一般用于处理有特殊要求的类或者函数,此时的泛型模板无法处理这种情况。

#include <iostream>
#include <cstring>
using namespace std;

template<typename T>
class A {
  public:
    bool cmp(const T &t1, const T &t2) {
        return t1 == t2;
    }
};

template<>
class A<char*> {   // 这里是全特化,仍然需要tempalte<>声明
  public:
    bool cmp(const char* t1, const char* t2) {
        while(*t1 != '\0' && *t2 != '\0') {
            if(*t1 != *t2) {
                return false;
            }
            ++t1;
            ++t2;
        }
        return true;
    }
};

int main() {
    A<int> cmp;
    cout << cmp.cmp(1, 2) << endl;
    char* c1 = "hello";
    char* c2 = "hello";
    A<char*>cmp1;
    cout << cmp1.cmp(c1, c2);
    return 0;
}

上述是一个类的全特化声明,这是一个比较类,但是==比较的是C风格字符串的首地址,而我们需要比较两个C风格的字符字符串内容是否相等,所以进行一次全特化。

对于函数,也是用类似的操作:

#include <iostream>
#include <cstring>
using namespace std;

template<typename T1, typename T2>
bool cmp(T1 &t1, T2 &t2) {
    return t1 == t2;
}

template<>
bool cmp(char* &p1,  char* &p2) {
    auto pt1 = p1, pt2 = p2;
    while(*pt1 != '\0' && *pt2 != '\0') {
        if(*pt1 != *pt2) {
            return false;
        }
        ++pt1;
        ++pt2;
    }
    return true;
}

int main() {
    char* p1 = "test";
    char* p2 = "test";
    int a = 0, b = 1;
    cout << cmp(a, b) << endl;   // 0
    cout << cmp(p1, p2) << endl; // 1
    return 0;
}

偏特化

如果我们指向特别制定部分的类型,那么需要进行特化,还是以上述的模板为例子:

#include <iostream>
#include <cstring>
using namespace std;

template<typename T, typename T1>
class A {
  public:
    A() = default;
    A(const T1& n) {
        cout << n << endl;
    }
    bool cmp(const T &t1, const T &t2) {
        return t1 == t2;
    }
};

template<typename T1>  // 片特化
class A<char*, T1> {
  public:
    A() = default;
    A(T1& n) {
        cout << n << endl;
    }
    bool cmp(const char* t1, const char* t2) {
        while(*t1 != '\0' && *t2 != '\0') {
            if(*t1 != *t2) {
                return false;
            }
            ++t1;
            ++t2;
        }
        return true;
    }
};

int main() {
    char* p1 = "hello";
    char* p2 = "hello";
    A<int, char*>c(p1);
    cout << c.cmp(1, 2) << endl;
    A<char*, char*>c1(p2);  // 即使是片特化,也要全部声明模板
    cout << c1.cmp(p1, p2) << endl;
    return 0;
}

函数模板没有偏特化,因为有函数重载的概念,C++根据参数的类型来判断重载哪一个函数,如果还进行偏特化,这就与重载相冲突。但是,我们可一个对模板进行重载,从而实现偏特化。

template <typename T>
class C {...}; //此泛化版本的T可以是任何类型

template <typename T>
class C<T*> {...}; //特化版本,T为指针类型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++全特化与偏特化 的相关文章

  • Taglib:性能和崩溃问题

    我在 Qt 应用程序中使用 taglib 库 1 7 2 从音乐文件夹中读取 mp3 文件的一些元数据 问题是我发现它非常慢 例如 这是代码 QString path C Music QDir d path QStringList file
  • 如何调试Roslyn编译生成的dll?

    我正在使用 Roslyn CSharpCompilation 为我的插件生成 dll 文件 文件具有 OptimizationLevel Debug 并生成 pdb 文件 接下来 我使用 Assembly Load 将这些文件加载 到我的程
  • 如何重写实体数据模型创建的对象上的 Equals?

    我创建了一个实体数据模型 它从 SQLite 数据库中提取记录 其中一个表是 People 我想重写 person Equals 方法 但我不确定去哪里进行这样的更改 因为 Person 对象是自动生成的 我什至看不到该 autogen 代
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel
  • 如何在 C++ 中从模板基类的构造函数调用模板超类的构造函数?

    我正在使用 sublimetext3 用 c 进行编程 我的程序有一个名为 Array 的超类和一个名为 IntArray 的子类 这两个类都是模板类 目前 我在编译该程序时遇到问题 它不断在我的 IntArray cpp 文件中给出错误
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 如何在 C++ 中初始化嵌套类的构造函数

    我在初始化嵌套类构造函数时遇到问题 这是我的代码 include
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • close-on-exec标志介绍

    在执行exec 之前 程序有时需要确保关闭某些特定的文件描述符 尤其是在特权进程中调用exec 来启动一个未知程序时 并非自己编写 抑或是启动程序并不需要使用这些已打开的文件描述符时 从安全编程的角度出发 应当在加载新程序之前确保关闭那些不
  • 视频技术阐释

    目录 一 视频定义 二 视频原理 三 视频中的图像表达原理 四 视频的基础参数 帧 长宽比 分辨率 帧率 码率 重采样率 色深 五 视频的高低频 六 视频编码与格式 七 视频评价 八 视频开发库 九 视频协议 十 常用视频编辑软件 一 视频
  • Golang面试题整理

    1 make和new区别 make和new都是go的内置函数 builtin包下 func new Type Type 内建函数new分配内存 其第一个实参为类型 而非值 其返回值为指向该类型的新分配的零值的指针 func make Typ
  • stm32输出比较模式与PWM模式总结

    文章目录 前言 一 输出比较模式和PWM模式 二 PWM模式 1 原理 2 配置cubemx 3 代码及验证 三 输出比较模式 1 原理 2 配置cubemx 2 代码及验证 总结 前言 最近因为从标准库过渡到hal库 又重新温习了一遍定时
  • SQL 2000递归查询

    网上的做法都是不能以NUL为关键字进行递归查询 现修改如下 可以任意进行递归 记录备忘 查询指定节点及其所有子节点的函数 alter FUNCTION GetLevel ID nvarchar 36 RETURNS t Level TABL
  • 13 Binder通信之ServiceManager

    Binder通信之ServiceManager 一 前言 Android系统中存在很多service 当某个应用调用系统某个service的功能时 往往向系统发出请求 调用该服务的外部接口 这种外部接口我们通常叫做代理接口 也就是说要拿到目
  • WinRAR在DOS下压缩/解压缩的使用方法

    用实例来说明问题 我的WinRAR路径 C Program Files WinRAR WinRAR exe 用法 rar lt 命令 gt lt 开关 1 gt lt 开关 N gt lt 压缩文件 gt lt 文件 gt lt 列表文件
  • Fortran 77

    FORTRAN结构化程序设计 第一章 FORTRAN语言程序设计初步 1 1 Fortran语言发展概况 1 2 简单的FORTRAN程序分析 1 3 FORTRAN源程序书写格式 1 4 Fortran程序的编辑与运行 1 5 常量 1
  • Java 集合框架

    1 集合框架概述 集合和数组的区别 数组的弊端 数组初始化后 长度不可变 不利于扩展 数组中提供的属性和方法少 不便于进行添加 删除 插入等操作 而且效率不搞 同时无法直接获取存储元素的个数 数组存储的数据是有序的 可以重复的 gt 存储数
  • 图文详解YUV420数据格式

    原文地址 http www cnblogs com azraelly archive 2013 01 01 2841269 html 1 YUV简介 YUV定义 分为三个分量 Y 表示明亮度 Luminance或Luma 也就是灰度值 而
  • SPI中的CPOL和CPHA概念

    经常会提及SPI分为四种模式 Mode 0 Clock Polarity CPOL 0 and Clock Phase CPHA 0 Mode 1 CPOL 0 and CPHA 1 Mode 2 CPOL 1 and CPHA 0 Mod
  • 前滚和回滚详细过程举例

    1 前滚和回滚介绍 前滚和回滚 是Oracle数据库实例发生意外崩溃 重新启动的时候 由SMON进行的自动恢复过程 因为oracle是先把操作命令写到 SGA的log buffer中 然后修改 数据 因此发生故障时 日志中的对数据库修改的记
  • OpenCV代码提取:rotate函数的实现

    OpenCV中并没有直接提供实现rotate的函数 这里通过getRotationMatrix2D和warpAffine函数实现rotate 并增加了一个crop参数 用来判断是否进行crop 目前支持uchar和float两种类型 经测试
  • CSS相关问题

    目录 第三方组件样式修改不生效问题 方法一 非scoped 方法二 deep 深度修改 方法三 lt lt lt 深作用选择器 第三方组件样式修改不生效问题 问题背景 由于el select组件下拉选项被弹窗遮挡 需要修改el select
  • iOS cell.accessoryType在黑暗模式下的显示问题

    iOS UITableViewCell 提供了 accessoryType 属性用来设置 cell 右侧图标 在黑暗模式下使用 发现按钮的颜色比较暗 cell accessoryType UITableViewCellAccessoryDi
  • 卷积神经网络(三)

    六 三维卷积 在经历了二维灰度图的卷积操作之后 如何进行三维卷积 RGB图像 呢 我们一起来看下 首先我们还是给出一个6 6的图像 不过因为有RGB三个通道 所以图像变成了6 6 3 同样的 在二维灰度图中3 3的卷积核也要相应的更改为3
  • 智能家居项目总结以及学习总结

    学习总结 是一段艰辛的路程 是一段值得回忆的经历 一切都是为了秋招 为了将来有更好的生活 为了能够成为一名嵌入式工程师 从熟悉的C语言 半吊子的数据结构和简单算法 linux下的IO操作 进线程编写 socket套接字的应用 QT和C 的学
  • Java+Selenium实现网页截图

    概述 使用Java语言 实现网页截图 本文仅考虑Selenium方案 如果对其他方案感兴趣 可参考Java实现HTML页面截图功能 实现 大名鼎鼎的自动化测试工具 引入最新稳定版依赖
  • mysql计算时间差-本例为计算分钟差然后/60计算小时保留一位小数,由于直接得小时只会取整...

    ORDER TIME datetime NOT NULL 字段类型 SELECTso ID so ORDER TIME NOW CONCAT ROUND TIMESTAMPDIFF MINUTE so ORDER TIME NOW 60 1
  • C++全特化与偏特化

    全特化 全特化一般用于处理有特殊要求的类或者函数 此时的泛型模板无法处理这种情况 include