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

标签 c++ templates explicit-instantiation

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

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);

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

template char max(char a, char b);

我们能从中获得什么?

最佳答案

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

当您最终将库与客户端应用程序链接时,链接器将找到您的库支持的类型的实现。

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

关于c++ - 什么时候我们需要显式实例化模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46420454/

相关文章:

C++ 模板显式实例化,模板参数是类模板

c++ - 二维角色的 move 仅在一个方向上有效

c++ - 模板参数推导和统一

C++11 模板 : How to ensure that the type inherits a class?

c++ - 你如何强制模板匹配基类?

c++ - 当显式模板实例化定义先于显式声明时,GCC 和 clang 不同意

c# - 当输出参数是一个类时,如何在 C++ 中调用 COM 方法?

c++ - 我通过函数 SENDTO 通过套接字(c++)发送结构并由 RECVFORM 接收,但总是得到一些垃圾值

c++ - 经典数组与 std::array

c++ - 如何测试类型参数是否为模板类型