25-模板的调试 浅实例化(Shallow Instantiation) 模板出错时通常伴随着冗长的诊断信息,真正的问题一般出现在一长串实例化之后 template<typename T> void f1(T& p) { *p = 0; 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 24-表达式模板 表达式模板是为了支持一种数值数组的类引入的技术。比如希望像内置类型一样对数组进行下列操作,要在支持这种紧凑写法的同时获得高效率,就需要通过表达式模板来完成。表达式模板与元编程互补,元编程主要用于小的、大小固定的数组,表达式模板则用于能在运 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 23-标签联合 这里开发一个类似于std::variant的类模板Variant,Variant提供了比union更好的类型安全,其行为如下 #include "variant.hpp" #include <iostream> #include 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 22-Tuple 基本Tuple设计存储(Storage) N>0个元素的tuple可存储为一个单元素(首元素)和一个包含N-1个元素的tuple(尾),零元素tuple作特殊情况处理。如Tuple<int, double, std::strin 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 21-Typelist Typelist解析 Typelist是类型元编程的核心数据结构,不同于大多数运行期数据结构,typelist不允许改变。比如添加一个元素到std::list会改变其本身,而添加一个元素到typelist则是创建一个新的typelist 一 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 20-元编程 值元编程(Value Metaprogramming) 常量表达式最初只能用 enum 来声明 template<int N> struct Fac { enum { value = N * Fac<N - 1>::val 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 19-桥接静态多态与动态多态 函数对象、指针与std::function 函数对象用于给模板提供一些可定制行为 #include <iostream> #include <vector> template<typename F> void forU 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 18-模板与继承 空基类优化(EBCO)布局原则 C++不允许类大小为0,比如数组元素为类时,若类大小为0则数组大小也是0,这会导致指针运算失效。虽然不能存在大小为0的类,但标准规定,空类为基类时,只要不与同一类型的另一个对象或子对象分配在同一地址,就不用分 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 17-基于类型属性的重载 基于模板实参属性重载函数模板是很自然的需求,比如 template<typename Number> void f(Number); // only for numbers template<typename Contain 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 16-Traits的实现 01 一个实例:累加一个序列1.1 Fixed Traits#include <iostream> template <typename T> T accum(const T* beg, const T* end) { T 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 15-特化与重载 重载模板以适用不同的情况 下面用于交换两个对象的函数模板exchange可以处理简单类型,但如果T是下面的类,就没必要再拷贝一次对象并调用两次赋值运算符,而只需要使用成员模板exchangeWith交换内部的指针 template< 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed 14-模板实参推断 推断的过程 每个实参-参数对的推断都是独立的,如果结果矛盾推断就会失败 template<typename T> const T& max(const T& a, const T& b) { return 2021-10-26 cpp Cpp-Templates-2ed cpp template Cpp-Templates-2ed