我们什么时候需要显式实例化模板函数?

When do we need to explicitly instantiate a template function?

假设我们有一个模板函数:

template <class T> T max(T a, T b) { return a > b ? a : b; }

由于编译器在模板参数推导过程中不执行任何隐式类型转换,我们可以通过以下两种方式调用max(2, 5.5)

  1. 使用转换:max(static_cast<float>(2), 5.5f);
  2. 使用显式模板实例化:max<float>(2, 5.5);

第二种情况对我来说很有意义,但是我们什么时候以下面给定的方式进行显式模板实例化(实例化而不调用函数 max with char 类型):

template char max(char a, char b);

我们从中获得了什么?

如果您正在编写一个库,则不会实现库代码未调用的模板,因此该库可能会缺少您打算提供的某些功能。 显式实例化将强制编译器为指定模板创建一个实现,即使没有调用它也是如此。

当您最终 link 带有客户端应用程序的库时,linker 将找到您的库支持的类型的实现。

也许母语为英语的人的解释会更清楚:https://docs.microsoft.com/it-it/cpp/cpp/explicit-instantiation