c++ - C++ 编译如何处理共享库和模板

标签 c++ compilation stl

我曾经在某处读到,C++ 本质上是根据编译时的使用情况枚举所有可能的模板类型,因此模板的概念在运行时不存在。这似乎也是来自 Template Compilation 的公认答案。

我的问题是,如果是这种情况,当一切都已编译并完成时,STL 如何处理自定义类型? 这可以更广泛地应用于任何使用模板编译的自定义库。

(我本可以在答案的评论中提出这个问题,但我没有足够的分数)

最佳答案

如果一个库想要提供其客户可以用任意类型实例化的模板,它必须在头文件中提供模板的完整定义。这就是为什么许多 C++ 库(包括大部分 Boost 库)都是仅包含头文件的原因。然后,编译器可以访问模板的定义,并可以使用客户端作为模板参数提供的任何类型/值对其进行实例化。

有关该主题的详细处理,请参阅 Stack Overflow 问题 Why can templates only be implemented in the header file? .


请注意,这仅适用于如我所说的模板用于任意类型的情况。如果实例集是有限的并且可以在构建共享库时确定,则库可以创建它想要的所有模板的显式实例化它想要支持的模板参数的所有组合。那么,暴露模板的定义就没有必要了,当然,在客户端代码中实例化不同类型的模板是不可能的。

例如,有一些几何库将它们的定义作为模板提供,以便它们可以使用 floatdouble 来表示 float , 但不公开模板定义;他们只是使用 floatdouble 预先实例化所有代码。客户端随后可以使用这些实例化,但不能将它们与例如 long doubleMyCustomFloat 一起使用。

关于c++ - C++ 编译如何处理共享库和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56287916/

相关文章:

c++ - 从中序遍历打印所有二叉树

c++ - Google NaCl 是否支持 C++ 11 编译器的异常?

c++ - 添加 "reference"指向静态库项目 : still need to include directory

go - 什么是 golang 中的上下文寄存器?

iphone - 在 Xcode 中编译 sqlite 项目时出错

c++ - 调用成员函数时出错

html - CSS 错误编译

c++ - 在 C++ 排序中指定比较函数的参数

c++ - 如何从 std::vector<string> 构造 std::string?

c++ - 如何为已明确定义其比较函数的集合定义迭代器?