鍍金池/ 問答/C++  網(wǎng)絡(luò)安全/ C++ 既然有了重載函數(shù),函數(shù)模版特化還有什么意義?

C++ 既然有了重載函數(shù),函數(shù)模版特化還有什么意義?

如函數(shù)模板

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

可以編寫const char*的特化版本

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

但是與其加一個特化,為什么不直接去寫一個重載函數(shù)?特化的意義在哪里?

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

UPDATE:以下為修正語法錯誤版

可以編寫const char*的特化版本

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

但是與其加一個特化,為什么不直接去寫一個重載函數(shù)?特化的意義在哪里?

bool equal(const char* const l, const char* const r)
回答
編輯回答
還吻

對于函數(shù)模板特化,目前公認(rèn)的觀點是沒什么用,并且最好別用。Why Not Specialize Function Templates?

不過存在一些只允許特化的特殊場合:比方說在擴展std::swap時,標(biāo)準(zhǔn)約定只允許特化,不允許重載。Extending the namespace std

函數(shù)模板特化和重載在重載決議時有些細微的差別,了解一下這些差別還是有必要的。這些差別引發(fā)的效果中比較有用的一個是阻止某些隱式轉(zhuǎn)換。如當(dāng)你只有void foo(int)時,以浮點類型調(diào)用會發(fā)生隱式轉(zhuǎn)換,這可以通過特化來阻止:

template <class T> void foo(T);
template <> void foo(int) {}
foo(3.0); // link error

雖然模板配重載也可以達到同樣的效果,但特化版的意圖更加明確。

2017年12月10日 07:48