c++ - 完全专用的模板函数是否与常规函数相同?
问题描述
如果我有:
template <typename T>
bool name (std::string);
template <> bool name<int>(std::string);
完全专业化的功能和我的其他常规功能有什么区别。
例如在标题中我必须有这些声明加上模板定义;不过,我可以在源文件中与所有其他常规函数一起拥有专门的定义。他们是一样的吗?
这比inline
在标题中定义专用模板更好吗?
解决方案
当模板本身通过重载决议选择时,函数模板特化确定调用的效果(它使用特化的签名,而不是定义)。无论专业化是隐式生成还是显式生成,都是如此。
一个单独的函数自己参与重载决议,以轻微的优势与函数模板竞争,可以很容易地被模板参数推导抵消(尽管不是在这里,因为你T
不能推导出来)。它可以通过使用显式模板参数列表完全排除(如果可以推导出所有模板参数,即使是一个空的),这意味着仍然应该为所有类型的模板提供一个合理的定义(即使有些被删除或没有编译)。
至于inline
,关注点与任何函数的关注点没有什么不同:在头文件中提供定义对于优化很重要,允许只有头文件的库,减少文本重复,……或者只是产生更紧密的耦合,使代码更难更改. 由于主模板的定义通常必须在标题中,因此可能存在将专业化定义也放在那里的偏见。与往常一样,需要了解应用和判断。
推荐阅读
- google-chrome-extension - 无法为 chrome 扩展设置价格或选择免费试用
- python - 是否可以将列表字典解析为 TFRecord 文件?
- bash - 如何等到在 bash 中完成 AWS CloudFormation 堆栈创建或更新?
- flutter - 为什么 Flutter 偏爱组合而不是继承?
- ansible - Ansible:如何将字符串附加到列表的每个值
- javascript - 有没有办法在不重新加载页面的情况下重新加载 JS 中的变量?
- flutter - Flutter Color.RGBO 和 adobeXD 相同颜色值不匹配?
- docker - 将 extra_hosts 添加到 docker 文件
- python - 使用数据列表时如何计数
- java - Gradle 不应等待调试器附加