假设我们有一个模板函数:
template <class T> T max(T a, T b) { return a > b ? a : b; }
由于编译器在模板参数推导过程中不会执行任何隐式类型转换,因此我们可以调用 max(2, 5.5)
通过这两种方式:
- 使用强制转换:
max(static_cast<float>(2), 5.5f);
- 使用显式模板实例化:
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/