类型擦除
更新时间:2026-10-01。是理解
std::function、减少头文件耦合的关键模式。
一、三段结构
concept(抽象接口)+ model<T>(模板派生,转发到具体类型)+ wrapper/handle(持有 concept 指针)。包装任意可调用对象后,外部只见统一类型,具体类型被“擦除”。

二、代价与选择
可能堆分配 + 虚调用(std::function 有小对象优化);类型集合封闭时 variant + visit 无虚表更优,开放集合用类型擦除;它也是 Pimpl、外部多态的基础。
常见坑
- 在模板里塞需要具体类型的逻辑。
- 忽视拷贝/析构虚接口(要实现 clone)。
- 每次构造都堆分配而忽略 SBO。
小结
总结
类型擦除让"一个统一类型容纳不同具体类型"(std::function、std::any 背后机制),结构是三段式——concept 抽象虚接口 + model<T> 模板派生类把调用转发给具体类型 + handle/wrapper 持有 concept 指针,外部只见统一类型、具体模板参数被擦除,从而桥接编译期模板与运行期多态(也是 Pimpl/外部多态的基础);代价是可能的堆分配+虚调用(可用小对象优化),且要实现 clone 等拷贝/析构接口;类型集合封闭时改用无虚表的 variant + visit 更优。