我应该始终在头文件中定义整个模板类吗?

Avi*_*ohn 4 c++ templates

由于某种原因,C++ 似乎不喜欢将模板类(即声明为 的类template <typename T> class Thing)拆分为.h和 一个.cpp文件,就像处理任何其他类一样。

这是否意味着在编写模板类时,我应该将其全部写入头文件中?在这些情况下,C++ 程序员会做什么?

编辑:我知道还有其他方法可以将其全部写入.h文件中。但最好的选择是什么?或者最常见的选择是什么?

How*_*ant 5

将模板的定义拆分到另一个文件中是很流行的。它是如此受欢迎,甚至可能是最常见的做法,但我对此并不乐观。

认为这是不好的做法(而不是将定义放在同一个标​​头中),原因如下。

我编写代码时的优先事项是(最重要的):

  1. 正确性。
  2. 运行时性能。
  3. 编译时性能。
  4. 可维护性/易于阅读。
  5. 容易写。

只要模板定义位于同一标头中,或位于该标头包含的另一个文件中,第一优先级的正确性就不会以任何方式受到影响。

第二优先级运行时性能不会受到丝毫影响。

第三优先级将定义放在单独的文件中会对编译时性能产生负面影响。多少是有争议的。但是编译器不可能编译 X 数量的代码并打开/关闭两个文件,就像它在仅打开/关闭一个文件时编译完全相同的代码一样快。我的一位朋友是一位出色的编译器编写者,他曾经告诉我,我可以要求他的编译器做的最慢的事情就是打开文件。这是在我们进行像今天一样多的编译时计算之前的情况,但仍然......

第四个优先级可维护性/易于阅读是相当主观的。但在我看来,单独的文件会对这个优先级产生负面影响。当我阅读代码时,如果所有代码都在一个文件中,我通常会更容易理解它。当我不得不去寻找文件的名称或位置不明显时,我真的很恼火。当定义被分成许多文件时,我会更加恼火。为了我的钱,一个文件优化了这一优先级。

第五优先事项易写性也是相当主观的。我认为这两种方式都没有太大优势。将所有内容放入一个文件中要容易一些。但创建一个新文件肯定不难。我认为“单文件方法”在这一优先级上具有非常微小的优势。

总而言之,在我的五个优先事项中,其中两个最重要,这个决定绝对没有任何区别,并且单独的文件对 3 个较低优先事项有很小的负面影响。在 3 个较低优先级中,其中最重要的是,编译时性能客观上会受到负面影响。不可否认,两个最低优先级对于它们是否受到积极或消极影响是主观的。

我认为将模板定义放在单独的标头中没有任何好处,而且成本也很小。