模板,只在头文件中编码?

77jt777

最近我了解到如果我想使用模板,我应该只在头文件中实现代码。我知道有解决方案可以在 .h 和 .cpp 文件中做到这一点,但只是假设我不想这样做,我应该在 .h 文件中写我所有的代码吗?即使程序可能很大,这是一种编写代码的好方法吗?此外,只有 .h 文件(不包括 main 函数)并且从不使用 .cpp 文件看起来很奇怪。

2b-t

由于 C++ 编译过程,模板通常无法像通常对标头 ( *.h) 和源文件 ( *.cpp)那样将声明和接口文档与实现分开。

在编译过程中,所有头文件都包含在调用它们的源文件中,然后这些源文件被独立处理,最后所有生成的目标文件链接在一起成为一个可执行文件。模板是通用数据类型的函数,它们仅针对调用它们的数据类型进行实例化。这意味着模板函数不会创建任何代码,只要它没有被具有有效模板参数的人实例化。您必须以某种方式确保使用访问模板函数的所有源文件所需的数据类型实例化模板。

  • 如果您将声明放在头文件中并将实现放在源文件中(就像您通常对函数所做的那样),则只会实例化在此特定源文件中已知的那些版本。这意味着需要不同参数集的任何其他源文件可能会导致链接器错误,因为它不知道源文件不包含模板参数的正确组合,从而使其不可移植。
  • 您可以手动实例化所有需要的版本,这会减少开销,但通常这会让您失去很多灵活性,因为您必须事先定义哪些模板参数将用于其他翻译单元。
  • 最后,您可以简单地将声明和实现保留在头文件中这会减慢编译过程,因为必须将标头的所有内容粘贴到调用它的所有源文件中。因此,有些人不喜欢大量模板化的库,例如Boost,但它为您提供了最大的灵活性。这种影响虽然可以通过诸如预编译头文件之类的功能来减少为了使这更容易再次阅读,一些库通过将声明放在*.h文件中并在*.hpp-files 中定义实现(类似于* .cpp请参见此处将声明(和文档)与实现分开

所以通常它取决于用法:如果您知道特定模板函数仅在特定源文件中使用,您可以将文档、声明和实现放入源文件(而不是头文件)中。如果要与多个源文件共享模板函数,请将声明和实现放在标题中。这通常是标准方式,因为它最灵活。如果您编写了一个完全模板化的库,那么可能会将文件中的声明和文档以及文件中的*.h实现分开*.hpp文件可能是最有意义的,但主要是为了有一个更简单的概述。无论如何,在某些函数的声明和实现之间没有明确分离是完全正常的,因此某些头文件可能缺少相应的源文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章