共用方式為


函式樣板 (C++) 的部分排序

多個符合引數清單的函式呼叫的函式樣板可以是可用的。 C + + 會定義的部分排序函式樣板來指定所要呼叫哪一個函式。 排序是部分,因為可能有某些被認為是同樣的特製化的範本。

編譯器會選擇最特製化的樣板函式可以使用從可能的符合項目。 比方說,如果函式樣板採用型別 t,並將另一個函式樣板 T * 可供使用, T * 版本就會越來越專業和一般優於 t 版本時該引數是指標型別,即使兩者都是允許的相符項目。

使用下列程序來判斷一個函式樣板的候選是否越來越專業:

  1. 請考慮兩個函式樣板,T1 和 T2。

  2. 取代假設性的唯一型別 x 的 T1 中的參數。

  3. T1 中的 [參數] 清單中,以查看是否 T2 正確的範本,為該參數清單。 忽略任何隱含轉換。

  4. 重複相同程序 T1 和 T2 反轉。

  5. 如果一個範本是有效的樣板引數清單範本,但反之則不然,必須小於比其他樣板特製化被視為該範本。 如果使用上述步驟兩種樣板構成有效的引數給同仁們,然後將它們視為同等特殊化,,然後嘗試使用它們時,會造成模稜兩可的呼叫。

  6. 使用這些規則:

    1. 特定型別的樣板特製化是更專門比取得泛型型別引數。

    2. 範本只花 T * 是一個將只比更特殊 t,因為一輸入 X * 是有效的引數的 t 樣板引數,但 x 不是有效的引數的 T * 樣板引數。

    3. const t 是更專門比 t,因為 const x 是一個有效的引數的 t 樣板引數,但 x 不是有效的引數的 const t 樣板引數。

    4. const T * 是更專門比 T *,因為 const X * 是一個有效的引數的 T * 樣板引數,但 X * 不是有效的引數的 const T * 樣板引數。

  7. 下列範例適用於 Visual C++。NET 2003 中所指定的標準:

// partial_ordering_of_function_templates.cpp
// compile with: /EHsc
#include <iostream>

extern "C" int printf(const char*,...);
template <class T> void f(T) {
   printf_s("Less specialized function called\n");
}

template <class T> void f(T*) {
   printf_s("More specialized function called\n");
}

template <class T> void f(const T*) {
   printf_s("Even more specialized function for const T*\n");
}

int main() {
   int i =0;
   const int j = 0;
   int *pi = &i;
   const int *cpi = &j;

   f(i);   // Calls less specialized function.
   f(pi);  // Calls more specialized function.
   f(cpi); // Calls even more specialized function.
   // Without partial ordering, these calls would be ambiguous.
}

zaycz069.collapse_all(zh-tw,VS.110).gifOutput

Less specialized function called
More specialized function called
Even more specialized function for const T*

請參閱

參考

函式樣板