簡體   English   中英

Template Explicit Specialization和普通函數有什么區別?

[英]what is the difference between Template Explicit Specialization and ordinary function?

template <class T>
void max (T &a ,T &b)
{}//generic template   #1

template<> void max(char &c, char &d)
{} //template specializtion    #2

void max (char &c, char &d)
{}//ordinary function      #3

1,2和3有什么區別?

  1. 是一個模板功能
  2. 是前一個模板函數的完全特化(不過載!)
  3. 是函數的重載

以下是C ++編碼標准的摘錄:101規則,指南和最佳實踐

66)不要專門化功能模板

函數模板特化從不參與重載:因此,您編寫的任何特化都不會影響使用哪個模板,這與大多數人直觀期望的相反。 畢竟,如果你編寫了一個具有相同簽名而不是函數模板特化的nontemplate函數,那么將始終選擇nontemplate函數,因為它總是被認為是比模板更好的匹配。

本書建議您通過在類模板方面實現函數模板來添加間接級別:

#include <algorithm>

template<typename T>
struct max_implementation
{
  T& operator() (T& a, T& b)
  {
    return std::max(a, b);
  }
};

template<typename T>
T& max(T& a, T& b)
{
  return max_implementation<T>()(a, b);
}

也可以看看:

模板參數的匹配規則與重載函數的匹配規則略有不同。 當您嘗試使用不同tyoes的參數調用max()時,可以看到不同的示例:

max(1,'2');

這將匹配重載函數,但既不匹配基本模板也不匹配特化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM