模板元编程-模板特例化

2023-11-06

在模板元编程里面,有一种情况是模板特例化,就是你定义了一个模板类,并且专门为它写了一些特例,如下:

//定义了一个模板类Vec
template <class T, int N> class Vec {
public:
  Vec() { std::cout << "zero" << std::endl; }

private:
  T m_arr[N];
};
//特别注意这个特例化版本,
template <> class Vec<int, 4> {
public:
  Vec() { std::cout << "spec" << std::endl; }

private:
  float m_arr[4];
};

//完全特例化
template <> class Vec<float, 4> {
public:
  Vec() { std::cout << "all" << std::endl; }

private:
  float m_arr[4];
};
//部分特例化
template <int N> class Vec<bool, N> {
public:
  Vec() { std::cout << "one" << std::endl; }

private:
  char m_value[(N + sizeof(char) - 1) / sizeof(char)];
};

通过构造函数打印,我们来看一下具体是具体是怎么调用的:

int main() {
   Vec<int, 10> myVec;
  Vec<int, 4> myVec1;
  Vec<float, 4> myVec2;
  Vec<bool, 10> myvec3;
}

输出结果是:
在这里插入图片描述

归纳一下:
在定义模板特例之前必须已经有模板通例(primary template)的声明;

模板特例并不要求一定与通例有相同的接口,但为了方便使用(体会特例的语义)一般都相同;

匹配规则,在模板实例化时如果有模板通例、特例加起来多个模板版本可以匹配,则依据如下规则:对版本AB,如果 A 的模板参数取值集合是B的真子集,则优先匹配 A,如果 AB 的模板参数取值集合是“交叉”关系(AB 交集不为空,且不为包含关系),则发生编译错误,对于函数模板,用函数重载分辨(overload resolution)规则和上述规则结合并优先匹配非模板函数

关于最后一条可以看上面代码中的spec打印。

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

模板元编程-模板特例化 的相关文章

  • 低级挂钩/SetWindowsHookEx lParam 自动重复?

    在这里阅读 Windows PC 上如何实现键盘自动重复 https stackoverflow com questions 876852 how is keyboard auto repeat implemented on a windo
  • ASP.NET 如何在 Web API 中读取多部分表单数据?

    我将多部分表单数据发送到我的 Web API 如下所示 string example my string HttpContent stringContent new StringContent example HttpContent fil
  • Python 相当于 Bit Twiddling Hacks 中的 C 代码?

    我有一个位计数方法 我正在尝试尽可能快地实现 我想尝试下面的算法位摆弄黑客 http graphics stanford edu seander bithacks html CountBitsSetParallel 但我不知道 C 什么是
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 如何使用 Selenium Webdriver .NET 绑定设置 Chrome 首选项?

    这是我正在使用的 用户代理可以成功设置 而下载首选项则不能 Windows 7 Chrome 26 Selenium dotnet 2 31 2 chromedriver win 26 0 1383 0 ChromeOptions chro
  • 代码块 - 使用大地址感知标志进行编译

    如何使用以下命令在 64 位系统上编译 32 位应用程序LARGE ADRESS AWARE使用代码块标记 我需要使用超过 2GB 的内存 应该是添加的情况 Wl large address aware到链接标志 我不使用 CodeBloc
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 多个包含带有变量定义的头文件

    我只是构建一个简单的 C 项目 代码如下所示 head h ifndef HEAD H define HEAD H int my var 100 endif src1 cpp include head h src2 cpp include
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 如何编写完全可移植的 4 字节字符常量的编译时初始化

    遗留 代码大致如下所示 define MAKEID a b c d UInt32 a lt lt 24 UInt32 b lt lt 16 UInt32 c lt lt 8 UInt32 d define ID FORM MAKEID F
  • 使用 List.Contains 方法为 LINQ 构建表达式树

    Problem 我正在重构一些LINQ查询我们的 Web 应用程序中的多个报告 并且我尝试将一些重复的查询谓词移至它们自己的中IQueryable扩展方法 以便我们可以将它们重新用于这些报告以及将来的报告 正如您可能推断的那样 我已经重构了
  • Cordova 上的 ClearCookiesAsync()

    我正在尝试使用 wp8 cordova 中的插件来清除 WebBrowser cookie 我已经让它与 JavaScript 进行通信 并且我的 c 文件中有类似这样的内容 using WPCordovaClassLib Cordova

随机推荐

  • 出门旅行懂链改这些问题都好解决

    每到旅游热潮结束后 各大平台都会纷纷晒出出游 成绩单 国内很多人都是 报复式出游 各大景区都是人山人海 有些人旅游是为了修身养性 放松身心 有些人是为了观赏大自然风光 享受一场视觉盛宴 有些人是为了探索未知事物 追求一种差异化 个性化的旅游
  • 环形队列设计思路

    环形队列设计思路 一 数据结构 数据存储在一段连续的内存空间 通过写位置 读位置来控制数据的输入输出 二 数据操作 1 判断空逻辑 写位置 读位置 2 判断满逻辑 写位置 1 MAX SIZE 读位置 3 写数据逻辑 判断数据不满 在当前写
  • GPG error: http://debian.cn99.com testing Release: Unknown error executing gpgv

    mail apt get updateGet 1 http debian cn99 com testing Release gpg 189B Hit http debian cn99 com testing ReleaseErr http
  • Servlet上传文件

    一 核心方法 1 HttpServletRequest类相关方法 方法 描述 Part getPart String name 获取请求中给定name的文件 Collection
  • java爬虫,提供链接直接爬取网页代码

    其实我只想要爬到整个网页的源代码的就好 通过java的一个包jsoup 就可以直接爬取了 后面有下载源代码 含jsoup包 的链接 输入 网页链接 输出 网页源代码 代码比较简单 解析都在代码中 import org jsoup Jsoup
  • python中lower函数是什么意思_python中lower函数实现方法及用法讲解

    之前小编介绍过python中将字符串小写字符转为大写的upper函数的使用方法 upper函数 有将小写转为大写的需要 那也有将大写转为小写的情况 本文主要介绍在python中可以将字符串大写自摸转换为小写字母的lower函数 1 lowe
  • CreateThread()和_beginthread()有什么不同?

    CreateThread 和 beginthread 有什么不同 我们知道在Windows下创建一个线程的方法有两种 一种就是调用Windows API CreateThread 来创建线程 另外一种就是调用MSVC CRT的函数 begi
  • Chart控件的用法和部署

    最近 导师让我做统计图 因为以前没有接触过 所以动起手来 难免会遇到很多的问题 经过一段时间的搜集资料和亲手操作 终于实现了我需要的功能 为了方便大家以后会更好的使用Chart控件和节省大家的时间 因此和大家分享一下我做的过程 首先 需要安
  • 时序数据的内存服务

    说明 既要坚定锻炼成熟架构的道路 也要在合理的范围内重塑设计 计算时序数据的特征 少不了 Rolling 类的操作 过去 直接采用pandas进行rolling 效率很不错 但是在实战应用时不太行 反思下来 离线的操作拓展困难 很多都是一次
  • set常用方法及遍历方式

    set常用方法 Set 接口继承 Collection 接口 而且它不允许集合中存在重复项 所有原始方法都是现成的 没有引入新方法 具体的 Set 实现类依赖添加的对象的 equals 方法来检查等同性 public int size 返回
  • Qt之QGraphicsView进阶篇

    前言 上一章节介绍了 QGraphicsView 中的基础内容 具体请参考 Qt之QGraphicsView入门篇 这一章节我们来具体了解一下 GraphicsView 框架中有哪些特性 缩放与旋转 QGraphicsView 通过 QGr
  • 查看windows mstsc远程登陆日志(client ip)

    最近有个需求 要看一下windows MSTSC的登陆日志 测试环境 win10 参考 https social technet microsoft com Forums windows en US efabde54 be5e 4be2 b
  • [C6064]警告以及解决方法

    对于函数scanf s 当出现C6064这个警告的时候 预示着缺少一个整形参量 该参量的功能是表明输入字符的长度 可以使用sizeof strlen 等函数 例子如下 scanf s s book title sizeof book tit
  • 【Matlab智能算法】极限学习机-遗传算法(ELM-GA)函数极值寻优——非线性函数求极值

    往期博客 Matlab BP神经网络遗传算法 BP GA 函数极值寻优 非线性函数求极值 Matlab GRNN神经网络遗传算法 GRNN GA 函数极值寻优 非线性函数求极值 Matlab RBF神经网络遗传算法 RBF GA 函数极值寻
  • elementUI表格编辑状态下,如何获取修改过的行

    表格再编辑状态 需要获取到哪一行数据被修改了 面对这样一个场景 我们可以结合element的row click事件以及动态的监听 watch来实现 tableList 代表表格的数据 rowIds代表需要记录的id数组的集合 isUpdat
  • 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求 ADXL345三轴数字加速度计可以用来检测加速度 进而测量倾斜角度等 在这一篇中 我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现 1 功能概述 ADXL345是一款小而薄的
  • EPSANet学习笔记

    EPSANet学习笔记 EPSANet An Efficient Pyramid Squeeze Attention Block on Convolutional Neural Network Abstract 最近 研究表明 在深度卷积神
  • 常用的前端排序

    冒泡排序 前一个与后一个作比较 如果前一个大于后一个 两者交换位置 对每一对相邻元素做第一步的操作 针对所有的元素重复以上的步骤 除了最后一个 let arr 1 3 4 5 8 6 4 1 3 2 for var i 0 i
  • 等保2.0四级安全要求

    第四级安全保护能力 应能够在统一安全策略下防护免受来自国家级别的 敌对组织的 拥有丰富资源的威胁源发起的恶意攻击 严重的自然灾害 以及其他相当危害程度的威胁所造成的资源损害 能够及时发现 监测发现攻击行为和安全事件 在自身遭到损害后 能够迅
  • 模板元编程-模板特例化

    在模板元编程里面 有一种情况是模板特例化 就是你定义了一个模板类 并且专门为它写了一些特例 如下 定义了一个模板类Vec template