首頁 >後端開發 >C++ >C 11 的偏序如何決定更專業的函數模板?

C 11 的偏序如何決定更專業的函數模板?

Susan Sarandon
Susan Sarandon原創
2024-12-05 10:37:10695瀏覽

How Does C  11's Partial Ordering Determine More Specialized Function Templates?

函數模板推導中的偏序

問題:

問題:

C 11 標準描述了偏序程序用於比較函數模板的特化,但其意義並不完全清楚。您能提供範例解釋嗎?

答案:

為了確定一個函數模板是否比另一個函數模板更專業,該標準使用部分排序過程。此過程涉及為每個範本建立轉換後的函數類型,並對它們進行比較以確定哪個範本更專業。

第1 步:建立轉換後的函數類型

對於每個模板,轉換後的函數類型是透過以特定類型(稱為合成類型)替換類型參數來建立的。這些合成類型是唯一的,不會在程式碼中的其他地方使用。

步驟2:將轉換後的類型與原始模板匹配

匹配第一個模板的轉換後的函數類型與第二個模板的原始函數類型相反。然後以相反的方向重複該過程。

第3 步:確定專業化

如果一個轉換產生匹配,而另一個轉換沒有產生匹配,則具有匹配的模板轉型被認為更加專業化。如果在任一方向都找不到匹配項,則兩個範本都不會被視為比另一個更專業。

範例:
template<typename T, typename U>
void foo(T, U); // #1

template<typename T>
void foo(T const*, X<T>); // #2

考慮兩個函數範本:

將#1b (void foo(int, bool)) 的轉換函數類型與#2 的原始函數類型進行匹配(#2) 失敗。但是,將轉換後的函數類型 #2b (void foo(char const*, X)) 與原始函數類型 #1 (#1) 進行匹配會成功。 因此,函數模板 #2比函數模板 #1 更專業。

附加說明:這部分排序過程也用於比較部分類模板特化的特化。在這種情況下,該過程首先涉及為每個專業化創建虛構的函數模板,然後使用相同的規則來比較這些函數模板。

以上是C 11 的偏序如何決定更專業的函數模板?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn