如果我有
template <typename T>
bool name (std::string);
template <> bool name<int>(std::string);
完全专业化功能与我的其他常规功能有什么区别
例如,在标题中,我将必须具有这些声明以及模板定义;但是,我可以在所有其他常规函数的源文件中有专门的定义。他们是一样的吗?
与在标题中将专用模板定义为inline
相比,这是更好的做法吗?
答案 0 :(得分:0)
当通过过载解析(使用签名而不是定义的定义)选择模板本身时,功能模板专长确定调用的效果 )。无论是隐式生成还是显式生成专业化,都是如此。
一个单独的函数独自参与了重载解析,与函数模板进行了竞争,这有一个轻微的优势,可以很容易地通过模板参数推导来抵消(尽管这里不是,因为您的{{1} }不能推论)。可以通过使用显式模板参数列表将其完全排除(如果可以推导所有模板参数,甚至可以是一个空列表),这意味着仍应为所有类型赋予模板合理的定义(即使有些被删除或无法编译。
对于T
来说,关注点与任何函数都没有什么不同:在标头中提供定义对于优化很重要,允许使用仅标头的库,减少文本重复,…或只是产生更严格的含义耦合使代码更难更改。由于主要模板的定义通常必须位于标头中,因此可能也倾向于将专门化的定义放在其中。与往常一样,需要了解应用程序和判断。