第璋胁 发表于 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 统一调用不同可调用对象

#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

篙菠 发表于 2026-2-13 12:26:50

感谢分享,学习下。

陈兰芳 发表于 2026-2-23 09:56:02

这个好,看起来很实用

谭皎洁 发表于 2026-2-25 03:10:54

yyds。多谢分享

茅断卉 发表于 2026-2-25 04:10:02

yyds。多谢分享

圣罩 发表于 2026-2-25 05:09:59

东西不错很实用谢谢分享

丝甲坞 发表于 2026-2-25 20:16:43

感谢发布原创作品,程序园因你更精彩

劳暄美 发表于 2026-2-26 05:36:18

鼓励转贴优秀软件安全工具和文档!

福清婉 发表于 2026-2-27 20:36:06

感谢分享,学习下。

唐茗 发表于 2026-3-3 22:28:22

谢谢楼主提供!

韶侪 发表于 2026-3-4 05:34:38

谢谢楼主提供!

驼娑 发表于 2026-3-8 12:27:41

感谢分享,下载保存了,貌似很强大

揉幽递 发表于 2026-3-10 17:02:53

分享、互助 让互联网精神温暖你我

乳杂丫 发表于 2026-3-12 01:52:08

分享、互助 让互联网精神温暖你我

班闵雨 发表于 2026-3-12 04:37:48

这个好,看起来很实用
页: [1]
查看完整版本: 类型擦除与部分异步编程