主要观点:
- 介绍了 SumatraPDF 是用于查看 PDF 等的 Windows GUI 应用程序,其在 GUI 程序中常需回调,回调是函数和数据的组合,在编程语言中称为闭包,C++ 有
std::function<>
和 lambda(即闭包),lambda 可作回调但存在问题。 - 提出最简单可行的解决方案,即自定义
Func0
和Func1
来实现简单回调和带额外调用者提供参数的回调,相比std::function<>
虽有不足但有自身优势,如代码小、快、易理解等。 - 讨论了使用自定义解决方案的边缘效益,如在 MSVC 64 位下
std::function<>
为 64 字节,而Func0
和Func1
为 16 字节,模板代码易导致膨胀和编译慢,且能更好理解自己的实现。
关键信息:
std::function<>
和 lambda 可用于回调但 lambda 实现为编译器生成函数,命名不具描述性导致 crash 报告难读。Func0
通过模板实现结合代码和数据,解决了一些与std::function<>
相关的问题,如避免强制类型转换和类型不匹配。Func1
用于处理带额外参数的回调情况,保留了参数类型,避免了类型转换。
重要细节:
Func0
的定义及相关实现细节,包括构造函数、析构函数、判断是否为空的函数等,以及MkFunc0
函数的作用和实现。Func1
的定义及实现,用于处理带额外参数的回调,通过模板实现并保留参数类型。- 对比
std::function<>
和自定义解决方案在大小、编译速度等方面的差异,以及对理解实现的难易程度的比较。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。