在其他程序使用的头文件中,我是否只能声明模板?

时间:2009-10-07 21:58:01

标签: c++ templates header implementation

我想知道是否使用模板,在其他线程中我发现由于某些原因必须在头文件中实现模板。 多数民众赞成,我的问题是,如果其他程序使用它,是否需要源? 从另一个线程的答案的逻辑来看,似乎即使其他程序也需要完整的实现,因此编译器可以说一行是否可以使用模板化函数。

如果是的话,我认为模板对于希望其他人使用他的图书馆的开发人员来说不是一件好事吗? 如果不是,那么我们很好,将使用模板。

或者至少有什么方法可以节省我的辛苦,花费的时间,来自其他人的代码?

(我将使用stl矢量等,但我要求我自己的代码...模板似乎很好,除了你很多硬编码线或宏滥用,但如果其他人可以读取你的源而不是它使几乎没有意义[打开项目xD很有意义])

谢谢, 乔

3 个答案:

答案 0 :(得分:4)

如果您希望图书馆的用户能够使用您的模板,那么他们的源代码需要为这些用户所用。

但是,您有时可以设计模板类,以便大多数逻辑发生在非模板类中,这些类在标题中没有完整的源代码。

答案 1 :(得分:2)

这取决于您的模板是否是库接口的一部分,或者它们是否只是实现的一部分。

如果它们是界面的一部分(即可能是入口点返回特定模板类型的对象),那么是的,您需要将模板定义公开给外界。

但是如果模板只是实现的一部分,那么一旦构建了库,就不需要与库的使用者共享模板定义。

答案 2 :(得分:0)

您可以将模板编写为非模板(通常是非类型安全)代码的包装。

优点是......

  1. 无需分发非模板实现代码的来源。
  2. 这是减少模板膨胀的好方法。
  3. 明显的缺点是你有一个额外的抽象和开销层,非类型安全的实现代码显然需要一些小心。我倾向于在非模板代码中定义一个抽象的“工具”类,专门用于模板包装器。我称之为工具,因为方法不主要作用于工具状态,而是作为void *参数传入的对象。工具类在几种方法中封装了大多数类型 - 不安全问题。该模板还提供了用户实际使用的类型安全包装器,它与不安全的代码接口,提供工具实例和进行类型转换等。

    例如,如果我正在实现树数据结构,大多数树算法将是类型不安全的,并且将节点和数据项视为void *指针(或者可能是node *和data *指针,其中节点和数据被声明但未定义的结构)。我将有一个抽象的树工具库,其中包含用于节点创建,处理和其他基本操作的纯方法,并且包装器模板将基本上专门化树工具,提供知道节点和数据项的精确类型的方法实现,并将该工具的实例作为类成员持有。对于用户来说,包装器只是一个类型安全的容器,与其他容器一样。

    BTW - 在实施模板包装器时,请注意dependent name问题。