首页 > 解决方案 > 完全专用的模板函数是否与常规函数相同?

问题描述

如果我有:

template <typename T>
bool name (std::string);

template <> bool name<int>(std::string);

完全专业化的功能和我的其他常规功能有什么区别。

例如在标题中我必须有这些声明加上模板定义;不过,我可以在源文件中与所有其他常规函数一起拥有专门的定义。他们是一样的吗?

这比inline在标题中定义专用模板更好吗?

标签: c++function-templates

解决方案


当模板本身通过重载决议选择时,函数模板特化确定调用的效果(它使用特化的签名,而不是定义)。无论专业化是隐式生成还是显式生成,都是如此。

一个单独的函数自己参与重载决议,以轻微的优势与函数模板竞争,可以很容易地被模板参数推导抵消(尽管不是在这里,因为你T不能推导出来)。它可以通过使用显式模板参数列表完全排除(如果可以推导出所有模板参数,即使是一个空的),这意味着仍然应该为所有类型的模板提供一个合理的定义(即使有些被删除或没有编译)。

至于inline,关注点与任何函数的关注点没有什么不同:在头文件中提供定义对于优化很重要,允许只有头文件的库,减少文本重复,……或者只是产生更紧密的耦合,使代码更难更改. 由于主模板的定义通常必须在标题中,因此可能存在将专业化定义也放在那里的偏见。与往常一样,需要了解应用和判断。


推荐阅读