我曾经读过某个地方,C ++本质上会根据编译时的使用情况枚举所有可能的模板类型,因此模板的概念在运行时不存在。看来这也是模板编译所接受的答案
我的问题是,如果是这种情况,那么在一切都已编译并完成后,STL如何处理自定义类型?这可以更广泛地应用于使用模板编译的任何自定义库。
(我本可以在答案的注释中提出这个问题,但是我没有足够的观点)
如果库要提供其客户端可以用任意类型实例化的模板,则它必须在头文件中提供模板的完整定义。这就是为什么很多C ++库(包括大多数Boost)都是仅标头的原因。然后,编译器可以访问模板的定义,并可以使用客户端作为模板参数提供的任何类型/值实例化它。
有关该主题的详细处理,请参阅堆栈溢出问题。为什么只能在头文件中实现模板?。
请注意,这仅在如我所说的模板适用于任意类型的情况下适用。如果实例化集受到限制并且可以在构建共享库时确定,则该库可以为其想要支持的模板参数的所有组合创建所有模板的显式实例化。然后,不必公开模板的定义,但是当然,不可能在客户端代码中实例化具有不同类型的模板。
例如,有一些几何库将它们的定义作为模板提供,以便它们可以同时使用它们float
并double
表示浮点数,但不公开模板定义。他们只是使用float
和预先实例化了所有代码double
。然后,客户可以使用这些实例化,但不能将其用于exmaplelong double
或MyCustomFloat
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句