C++ 既然有了重载函数,函数模版特化还有什么意义?

发布于 2022-09-06 15:23:49 字数 354 浏览 39 评论 0

如函数模板

template <class T>
bool equal(const T l, const T r)

可以编写const char*的特化版本

template <>
bool equal<const char*>(const char* const  l, const char* const r)

但是与其加一个特化,为什么不直接去写一个重载函数?特化的意义在哪里?

bool equal(const char* const l, const char* const r)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦罢 2022-09-13 15:23:49

对于函数模板特化,一个流行的观点是没什么用,并且最好别用。Why Not Specialize Function Templates?

不过存在一些只允许特化的特殊场合:比方说在扩展std::swap时,标准约定只允许特化,不允许重载。Extending the namespace std (until C++20)

函数模板特化和重载在重载决议时有些细微的差别,了解一下这些差别还是有必要的。这些差别引发的效果中比较有用的一个是阻止某些隐式转换。如当你只有void foo(int)时,以浮点类型调用会发生隐式转换,这可以通过特化来阻止:

template <class T> void foo(T);
template <> void foo(int) {}
foo(3.0); // error, template foo is not defined

虽然模板配重载也可以达到同样的效果,但特化版的意图更加明确。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文