从 SumatraPDF 来的最简单的 C++回调

主要观点:

  • 介绍了 SumatraPDF 是用于查看 PDF 等的 Windows GUI 应用程序,其在 GUI 程序中常需回调,回调是函数和数据的组合,在编程语言中称为闭包,C++ 有std::function<>和 lambda(即闭包),lambda 可作回调但存在问题。
  • 提出最简单可行的解决方案,即自定义Func0Func1来实现简单回调和带额外调用者提供参数的回调,相比std::function<>虽有不足但有自身优势,如代码小、快、易理解等。
  • 讨论了使用自定义解决方案的边缘效益,如在 MSVC 64 位下std::function<>为 64 字节,而Func0Func1为 16 字节,模板代码易导致膨胀和编译慢,且能更好理解自己的实现。

关键信息:

  • std::function<>和 lambda 可用于回调但 lambda 实现为编译器生成函数,命名不具描述性导致 crash 报告难读。
  • Func0通过模板实现结合代码和数据,解决了一些与std::function<>相关的问题,如避免强制类型转换和类型不匹配。
  • Func1用于处理带额外参数的回调情况,保留了参数类型,避免了类型转换。

重要细节:

  • Func0的定义及相关实现细节,包括构造函数、析构函数、判断是否为空的函数等,以及MkFunc0函数的作用和实现。
  • Func1的定义及实现,用于处理带额外参数的回调,通过模板实现并保留参数类型。
  • 对比std::function<>和自定义解决方案在大小、编译速度等方面的差异,以及对理解实现的难易程度的比较。
阅读 12
0 条评论