C++_ 模板学习八
std::variant 与 std::visit 概述 std::variant 是 C++17 标准库提供的类型安全联合体 variant 解决什么问题 假设服务器收到的消息可能是 任意时刻,一条消息只会是其中一种 传统做法是手工组合枚举和 union 问题在于: 必须手动记...
std::variant 与 std::visit 概述 std::variant 是 C++17 标准库提供的类型安全联合体 variant 解决什么问题 假设服务器收到的消息可能是 任意时刻,一条消息只会是其中一种 传统做法是手工组合枚举和 union 问题在于: 必须手动记...
函数模板与实例化 模板是什么 普通函数只能处理声明好的类型 如果还要处理 double、std::string,不使用模板就需要重复编写 模板的作用是 描述一组具有相同结构、但类型不同的函数 这段代码本身不是一个普通函数,而是一个函数模板,也可以理解为编译器生成函数的“配方” 模...
惰性实例化与元函数组合 概述 示例 很多人会认为“不选择的分支不会编译”,但实际经常仍然报错 关键规则是 std::conditional 只负责选择已经成功形成的两个类型,不负责阻止模板实参本身被形成 什么是惰性实例化 考虑 仅仅把模板特化当成不完整类型使用,通常不需要实例化其...
模板错误与调试 概述 模板报错之所以经常出现几百行,不是因为真正存在几百个错误,而是因为编译器必须告诉你: 最外层调用了哪个模板 它实例化了哪个内部模板 内部模板又实例化了什么 最终哪个表达式不合法 最小示例 下面代码不能编译 模板代码什么时候被检查 模板通常经历以下阶段: 阶段...
Typelist——编译期类型容器 概述 普通容器保存运行期对象 Typelist 保存的是一组类型 它没有运行期元素,也不负责构造对象 所有内容都编码在模板参数包中 C++ 标准库没有名为 std::typelist 的类型,但: std::tuple<Ts...>...
模板定制体系 概述 大型模板库必须解决一个核心问题 库作者写好了通用算法,但怎样允许用户为自己的类型提供特殊行为 C++ 中没有唯一的定制机制,而是形成了一组工具 机制 最适合表达 traits 这个类型具有什么静态信息 policy 这个组件采用哪一种行为策略 tag disp...
大型模板源码阅读 概述 阅读大型模板项目时,最容易犯的错误是 从公共 API 跳进第一个模板定义,然后试图把所有分支、所有类型和所有平台代码全部看懂 正确方法是先固定一个具体调用,只追踪它实际经过的路径 我们只关心: 这个调用中每个模板参数是什么 最终选中了哪个重载 哪些对象被复...
非类型模板参数 NTTP 概述 前面使用的模板参数都是“类型” 非类型模板参数传递的是编译期常量值 固定容量的栈 值也是类型身份的一部分 下面是两个完全不同的类型 非类型模板实参必须是编译期常量 合法 不合法 Capacity 不会作为普通成员存储 Capacity 是编译期值,...
搜索当前标签