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

如函数模板

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)
阅读 5.9k
1 个回答

对于函数模板特化,一个流行的观点是没什么用,并且最好别用。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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题