C++ 完全专用化的模板函数是否与常规函数相同?

C++ 完全专用化的模板函数是否与常规函数相同?,c++,function-templates,C++,Function Templates,如果我有: template <typename T> bool name (std::string); template <> bool name<int>(std::string); 模板 bool名称(std::string); 模板bool名称(std::string); 完全专用函数和我的其他常规函数之间的区别是什么 例如,在标题中,我必须有这些声明和模板定义;然而,我可以在源文件中有专门的定义以及所有其他常规函数。它们是一样的吗 这是否比在标

如果我有:

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

template <> bool name<int>(std::string);
模板
bool名称(std::string);
模板bool名称(std::string);
完全专用函数和我的其他常规函数之间的区别是什么

例如,在标题中,我必须有这些声明和模板定义;然而,我可以在源文件中有专门的定义以及所有其他常规函数。它们是一样的吗


这是否比在标题中将专用模板定义为
inline
更好

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

一个单独的函数自己参与重载解析,与函数模板竞争,这有一点优势,可以通过模板参数推断轻松抵消(尽管这里没有,因为您的
T
无法推断)。可以通过使用显式模板参数列表(如果可以推导出所有模板参数,则即使是空的列表)将其完全排除,这意味着仍然应该为模板提供一个合理的定义,用于所有类型(即使某些类型被删除或未编译)


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

必须看到专门化(在使用它的代码之前)才能生效,因此通常需要在标题中。