传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中

并且,我们没有办法通知编译器不要触发模板的实例化。

template class std::vector<bool>; // 强行实例化
extern template class std::vector<double>; // 不在该当前编译文件中实例化模板

下面是一个示例演示如何使用外部模板:

// 文件: main.cpp

#include "mytemplate.h"

int main() {
    foo(42);  // 这里不会发生模板的实例化

    return 0;
}

在上面的示例中,我们有三个文件:

  • mytemplate.h:包含了一个模板函数foo的声明。
  • main.cpp:包含了main函数,在其中调用了foo函数。
  • implementation.cpp:包含了对foo函数的实例化,并在其他地方调用了foo函数。

这样做的好处是,如果我们有其他源文件也使用了foo函数,它们可以选择性地进行模板实例化,从而避免重复的实例化,节省编译时间和减小二进制文件的大小。