C++_ 模板学习七
Typelist——编译期类型容器 概述 普通容器保存运行期对象 Typelist 保存的是一组类型 它没有运行期元素,也不负责构造对象 所有内容都编码在模板参数包中 C++ 标准库没有名为 std::typelist 的类型,但: std::tuple<Ts...>...
Typelist——编译期类型容器 概述 普通容器保存运行期对象 Typelist 保存的是一组类型 它没有运行期元素,也不负责构造对象 所有内容都编码在模板参数包中 C++ 标准库没有名为 std::typelist 的类型,但: std::tuple<Ts...>...
惰性实例化与元函数组合 概述 示例 很多人会认为“不选择的分支不会编译”,但实际经常仍然报错 关键规则是 std::conditional 只负责选择已经成功形成的两个类型,不负责阻止模板实参本身被形成 什么是惰性实例化 考虑 仅仅把模板特化当成不完整类型使用,通常不需要实例化其...
类型萃取的设计与实现 概述 类型萃取(type traits)可以理解成编译期函数 它们主要通过: 类模板 偏特化 using 类型成员 static constexpr 成员 类型萃取的三种主要形式 类型 输入输出 例子 预测型 trait 类型 → bool is_same、...
SFINAE、std::enable_if 与C++20 Concepts SFINAE 是什么 模板参数替换失败不算错误 Substitution Failure Is Not An Error 这里不是说整个程序永远不会报错,而是 这个候选模板的替换失败本身不立即报错,编译器...
成员模板、变量模板与模板模板参数 成员模板 普通类和类模板都可以包含成员模板 类模板中的成员模板 同一个 Box<int> 对象可以调用不同的成员模板特化 类外定义成员模板 不同类模板特化之间的转换 默认情况下它们是完全不同的类型: 可以用成员模板实现转换构造 为什么...
非类型模板参数 NTTP 概述 前面使用的模板参数都是“类型” 非类型模板参数传递的是编译期常量值 固定容量的栈 值也是类型身份的一部分 下面是两个完全不同的类型 非类型模板实参必须是编译期常量 合法 不合法 Capacity 不会作为普通成员存储 Capacity 是编译期值,...
函数模板与实例化 模板是什么 普通函数只能处理声明好的类型 如果还要处理 double、std::string,不使用模板就需要重复编写 模板的作用是 描述一组具有相同结构、但类型不同的函数 这段代码本身不是一个普通函数,而是一个函数模板,也可以理解为编译器生成函数的“配方” 模...
概述 decltype 从 C++11 引入,用来在编译期获取一个实体或表达式的类型 它与 auto 最大的区别是: auto 通常会进行类型退化,而 decltype 会精确保留 const、引用、数组以及表达式的值类别 规则一:未加括号的名字或成员访问 如果操作数是: 未加括...
概述 C++20 协程的核心不是“创建线程”,而是 把一个函数编译成可以暂停、保存现场、稍后恢复的状态机 协程本身不提供线程、调度器、事件循环或异步 I/O 它只提供语言机制,真正决定“何时恢复”的是 Awaiter、线程池、Asio 等运行时 关键字 co_await 等待某个...
thread_info_base 干什么的 是一个per-thread(每线程)内存池 / 分配器缓存,核心目的是:减少异步操作中反复 new/delete 的开销 背景 ASIO 里每次调用 async_read、async_write 之类的操作,内部都需要分配一小块内存来保...