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

时间:2019-05-24 07:38:36

标签: c++ compilation stl

我曾经读过某个地方,C ++本质上根据编译时的使用情况枚举了所有可能的模板类型,因此模板的概念在运行时不存在。似乎也是Template Compilation

所接受的答案

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

(我本可以在答案的注释中问这个,但我的观点不够多)

1 个答案:

答案 0 :(得分:6)

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

有关该主题的详细处理,请参阅堆栈溢出问题Why can templates only be implemented in the header file?


请注意,这仅适用于如我所说的模板适用于任意类型的情况。如果实例化集受到限制并且可以在构建共享库时确定,则该库可以为其想要支持的模板参数的所有组合创建所有模板的显式实例化。然后,不必公开模板的定义,但是,当然不可能在客户端代码中实例化具有不同类型的模板。

作为一个例子,有一些几何库将它们的定义作为模板提供,这样它们就可以与floatdouble一起使用以表示浮点数,但不公开浮点数。模板定义;他们只需使用floatdouble预先实例化所有代码。然后,客户端可以使用这些实例化,但不能将其用于示例long doubleMyCustomFloat