2016-02-26 57 views
2

請向我解釋模板專業化選擇的規則。我舉一個例子:如何選擇部分模板專業化?

template<typename T1, typename T2 = int> 
struct S : false_type{}; 

template<typename T> 
struct S<T, float> : true_type{}; 

cout << boolalpha << S<float>::value; 

爲什麼輸出是false?一般來說,在專門的類中默認模板參數typename T2 = int會發生什麼情況?它是否引入了一些影響力?

+4

我不明白爲什麼你會期望這裏有什麼不同。 'S '中的'float'是* first *類型參數'T1',而不是第二個'T2'。但專業化是爲了如果'T2'是'浮動'。 – 5gon12eder

+0

@ 5gon12eder推測,OP試圖指定部分特化('T')的模板參數;不是一個不常見的初學者錯誤。 –

+0

我最初的想法是,我指定一個模板參數,編譯器應該選擇專業化,因爲它喜歡專業化基地。 – nikitablack

回答

6

選擇模板專業化發生在五個步驟:

  1. 使主模板聲明。 (<T1, T2 = int> S
  2. 填寫用戶指定的模板參數。 (T1 <- float
  3. 僅限函數模板:推導其他模板參數。
  4. 對剩餘的模板參數使用默認值。 (T2 <- int
  5. 使用偏序排列算法(C++ 14 14.5.6.2)來選擇最匹配的特化。 (<float, int>不匹配<T, float>,所以忽略專業化;只剩下可能性是主模板)
+0

這是合乎邏輯的!謝謝。 – nikitablack

+0

如果您在步驟5中查找部分排序的粗略解釋,我建議您查看此答案:https://stackoverflow.com/a/17008568/1248889 –