首页 > 解决方案 > 如何编写和打包使用模板的 C++ 库

问题描述

由于模板必须在头文件中定义/实现,鉴于我们不想共享源代码,我们如何打包这样的库?

标签: c++compilationpackaging

解决方案


您可以转发声明模板特化并将它们从您的 dll 中导出,但仅限于一组特定的类型。

一种替代方法是利用类型擦除。在这里,您的公共标头是模板化的,但它们会转换为非模板代码。

例如,您可以编写一个以极其灵活的格式进行图像处理的库。用户提供通道的位深度、含义和顺序(加法、线性、多透明度等)。

您存储通道信息并创建一个字节的平面缓冲区,并且在库构建中有足够的 stufd 来处理所有组合,而无需使用模板“跨越 ABI”。

这可能会变得非常极端。例如,Skia 有着色器,在运行时您可以提供 SkSL 字符串,它交叉编译到您选择的基于 GPU 或 CPU 的图像处理,然后生成可执行代码,在缓冲区上运行、优化。Skia 不允许自定义缓冲区布局,但没有什么能从根本上阻止它。

所有这些都是先进而晦涩的。最简单的模板库只是标题,可能带有非模板代码的内核。


推荐阅读