何时适合显式实例化模板?

时间:2014-07-28 23:25:03

标签: c++ templates

在相关问题Why can templates only be implemented in the header file?中,描述了两种避免链接器错误的策略:

  1. 在头文件中实现整个模板; OR
  2. 使用template class Foo<int>语法显式实例化模板。
  3. 从我收集的信息来看,#1似乎是“首选”方法并且在每个库中使用 - 大概是因为很难或不可能预测图书馆消费者想要使用哪些类型。我的问题涉及战略#2。

    具体来说,我为什么要这样做?

    仅供参考:我主要是C ++背景的C ++新手。我已经习惯了.NET样式的泛型,它更直接,是的,我理解为什么它们是不同的。但是,我认为C ++开发人员仍然关心耦合。表单#2是否不会引入特别烦人的耦合形式,其中开发人员必须不断编辑模板的.cpp文件,只是为了使用具有不同的,以前无法预料的类型的模板?那不是那种打败模板的目的吗?

    是否存在与解决方案#2相关的合法或重要用例?

2 个答案:

答案 0 :(得分:1)

在标题中实现整个模板有明显的优势(首选方法):

  • 添加模板特化:许多标准库模板可能是专用的。
  • 在新类型上使用它:模板是为了通用性,如果你不能选择你想要的模板参数,它会受到很大的限制。
  • 领取其他模板专业化。

那么,为什么在实现文件中使用显式模板实例化,并且只在头文件中提供模板的接口? (纯粹的方法根本没有使用过)

  • 实施隐藏。
  • 编译速度更快!!大量使用模板,我们有一个经典的 O(n * m)问题
  • 将这些模板放在共享库中以减少代码大小。

还有一种混合方法,它试图获得第二种方法的一些优点,同时保留所有第一种方法:

使用extern定义最常用的模板实例化,并提供共享库中的显式实例化。

这具有第一种方法的所有优点,但只有第二种方法的一个优点:
这些显式实例化可以在共享库中。

共享C ++语言库使用这种混合方法。

BTW:委员会不满足于当前的事态:
他们正在研究一个真正的模块系统,它将两者的优点结合起来 这篇SO帖子有一些信息:C++ Modules - why were they removed from C++0x? Will they be back later on?
2014年5月的C ++委员会提案:A Module System for C++

答案 1 :(得分:0)

如果要编写可供任何人使用的泛型类或函数,请使用数字1。如果要为多个特定类型重载类或函数,请使用数字2,但它们都具有相同的实现。