完全专用的模板函数是否与常规函数相同?
Is a fully specialized template function the same as a regular function?
如果我有:
template <typename T>
bool name (std::string);
template <> bool name<int>(std::string);
全特化函数和我的其他常规函数有什么区别。
例如在 header 中我必须有这些声明加上模板定义;尽管如此,我可以在源文件中对所有其他常规函数进行专门定义。它们是一样的吗?
这是否比在 header 中将专用模板定义为 inline
更好?
当通过重载决策(使用签名,但不是专业化的定义)。无论特化是隐式还是显式生成,都是如此。
一个单独的函数自己参与重载决议,与函数模板竞争略有优势,可以很容易地通过模板参数推导来抵消(虽然不是在这里,因为你的 T
无法推导出来)。它可以通过使用显式模板参数列表完全排除(如果可以推导出所有模板参数,即使是空的),这意味着模板仍然应该为所有类型给出一个合理的定义(即使有的被删掉或者不编译)。
至于 inline
,关注点与任何函数的关注点没有什么不同:在 header 中提供定义对于优化很重要,允许使用 header-only 库,减少文本重复,……或者只是产生更紧密的耦合,使代码更难更改。由于主模板的定义通常必须在 header 中,因此可能倾向于将专业化的定义也放在那里。一如既往,需要了解应用和判断。
如果我有:
template <typename T>
bool name (std::string);
template <> bool name<int>(std::string);
全特化函数和我的其他常规函数有什么区别。
例如在 header 中我必须有这些声明加上模板定义;尽管如此,我可以在源文件中对所有其他常规函数进行专门定义。它们是一样的吗?
这是否比在 header 中将专用模板定义为 inline
更好?
当通过重载决策(使用签名,但不是专业化的定义)。无论特化是隐式还是显式生成,都是如此。
一个单独的函数自己参与重载决议,与函数模板竞争略有优势,可以很容易地通过模板参数推导来抵消(虽然不是在这里,因为你的 T
无法推导出来)。它可以通过使用显式模板参数列表完全排除(如果可以推导出所有模板参数,即使是空的),这意味着模板仍然应该为所有类型给出一个合理的定义(即使有的被删掉或者不编译)。
至于 inline
,关注点与任何函数的关注点没有什么不同:在 header 中提供定义对于优化很重要,允许使用 header-only 库,减少文本重复,……或者只是产生更紧密的耦合,使代码更难更改。由于主模板的定义通常必须在 header 中,因此可能倾向于将专业化的定义也放在那里。一如既往,需要了解应用和判断。