Freigeben über


Partielle Bestellung einzelner Funktionsvorlagen (C++)

Mehrere Funktionen von Vorlagen, die die Argumentliste eines Funktionsaufrufs entsprechen, können verfügbar sein.C++ definiert eine partielle Reihenfolge von Vorlagen Funktion, um anzugeben, welche Funktion aufgerufen werden soll.Die Reihenfolge ist partiell, da es mehrere Vorlagen geben kann, die ebenfalls als speziell betrachtet werden.

Der Compiler wählt die spezielle Vorlagenfunktion aus, die von den möglichen Übereinstimmungen verfügbar ist.Wenn z. B. eine Funktionsvorlage einen Typ Tverwendet und andere ist die Funktionsvorlage, die T* akzeptiert, verfügbar, wird die Version T* spezialisiert und befindet sich über der generischen T-Version vorzuziehen, wenn das Argument ein Zeigertyp ist, obwohl beide zulässige Übereinstimmungen wären.

Verwenden Sie die folgenden Verfahren, um zu bestimmen, ob ein Func kandidat Vorlagen spezialisiert ist:

  1. Berücksichtigen Sie zwei Funktionen von Vorlagen, T1 und T2.

  2. Ersetzen Sie die Parameter in T1 durch einen hypothetischen eindeutigen Typ X.

  3. Mit der Parameterliste in T1 finden Sie unter wenn T2 eine gültige Vorlage für diese Parameterliste ist.Ignoriert alle impliziten Konvertierungen.

  4. Wiederholen Sie den gleichen Prozess mit umgekehrtem T1 und T2.

  5. Wenn eine Vorlage eine gültige Vorlagenargumentliste für die andere Vorlage ist, aber nicht das Gegenteil gilt, dass Vorlage als speziell kleiner als die andere Vorlage betrachtet wird.Wenn beide Vorlagen mit dem vorherigen Schritt für gültige Argumente voneinander bilden, werden sie als speziell einheitlich behandelt, und es wird ein Mehrdeutiger Aufruf von Ergebnissen bei dem Versuch, sie zu verwenden.

  6. Mithilfe dieser Regeln:

    1. Eine Vorlagen spezialisierung für einen bestimmten Typ ist speziell als eine, die ein generisches Typargument verwendet.

    2. Eine Vorlage, die nur T* hat, ist speziell als eine, die nur Takzeptiert, da ein hypothetischer Typ X* ein gültiges Argument für ein T Vorlagenargument ist, aber X ist kein gültiges Argument für ein T* Vorlagenargument.

    3. const T spezialisiert ist als T, da const X ein gültiges Argument für ein T Vorlagenargument ist, aber X ist kein gültiges Argument für ein const T Vorlagenargument.

    4. const T* spezialisiert ist als T*, da const X* ein gültiges Argument für ein T* Vorlagenargument ist, aber X* ist kein gültiges Argument für ein const T* Vorlagenargument.

  7. Das folgende Beispiel funktioniert in Visual C++ .NET 2003, wie im Standardwert angegeben:

// 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(de-de,VS.110).gifOutput

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

Siehe auch

Referenz

Funktionsvorlagen