找回密码
 立即注册
首页 业界区 业界 类型擦除与部分异步编程

类型擦除与部分异步编程

第璋胁 2026-2-11 21:00:12
类型擦除与部分异步编程: 消除差别,统一使用

C++ 中类型擦除最典型的实现思路分为两类——模板(编译期擦除)与多态(运行时擦除),这两种方式大家都比较熟悉。而标准库为我们封装了更易用的类型擦除工具,核心包括 std::function、std::any、std::span 和 std::variant,它们在不同场景下帮我们“消除类型差别,实现统一使用”;同时,类型擦除也是异步编程的核心基础,std::function 搭配相关组件可实现任意异步任务的统一调度,这也是我们将两者结合讲解的核心原因。
1. std::function:可调用对象的“统一调用接口”

std::function 是针对可调用对象的类型擦除工具,其底层实现核心是「抽象基类 + 模板子类」的多态模式,也是运行时类型擦除的典型应用:

  • 抽象基类:定义了与“函数签名”完全匹配的纯虚调用接口(比如 virtual Ret call(Args...) = 0),作为统一调用的基准;
  • 模板子类:存储具体的可调用对象(函数、lambda、仿函数、std::bind 结果等),并重写抽象基类的 call 方法,适配具体对象的调用逻辑。
正因为 std::function 是通过调用抽象基类的统一接口,间接呼叫存入模板子类中的具体函数,所以我们必须提前明确告知 std::function 完整的函数签名(返回值类型、参数类型、参数个数) —— 这是抽象基类定义统一调用接口的前提,只有签名一致,所有被擦除类型的可调用对象,才能通过抽象基类的接口被正确调用。也正因运行时的多态派发(通过抽象基类指针调用子类的 call 方法),std::function 会产生一定的运行时开销。
测试代码:std::function 统一调用不同可调用对象

[code]#include #include #include // 普通函数int add(int a, int b) { return a + b; }// 仿函数struct Multiply {    int operator()(int a, int b) { return a * b; }};int main() {    // 定义函数签名:int(int, int)    std::function func;    // 存储普通函数    func = add;    std::cout

相关推荐

您需要登录后才可以回帖 登录 | 立即注册