Implizite Konvertierungsvermeidung für nicht konstruierende Funktionen
Stellen Sie sich eine nicht konstruierende Funktion vor, die einen ganzzahligen Parameter erwartet, aber implizite Umwandlung von anderen Typen zulässt wie Zeichen, boolesche Werte und Long-Werte. Um dieses unbeabsichtigte Verhalten zu verhindern und sicherzustellen, dass die Funktion nur Parameter des angegebenen Typs akzeptiert, können wir die folgenden Techniken anwenden:
C 11 und höher Methode:
The Der direkteste Ansatz besteht darin, eine Funktionsvorlage zu definieren, die mit allen anderen Typen übereinstimmt:
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
Dies funktioniert, weil Nicht-Vorlagenfunktionen mit direkter Übereinstimmung verwendet werden Vorrang.
Vor-C 11-Technik:
Vor C 11 bestand eine alternative Lösung darin, eine Hilfsklasse zu erstellen, um das gewünschte Verhalten zu erzwingen:
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template <class T> void function(T a, DeleteOverload = 0); void function(int a) {}
Diese Technik basiert auf der Überladung mehrerer Funktionen mit ähnlichen Signaturen, wobei die Funktion mit dem erwarteten Typ annimmt Vorrang.
C 23-Update:
C 23 führt eine prägnantere und informativere Möglichkeit ein, mit dieser Situation umzugehen:
void function(int) {} // this will be selected for int only template <class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); }
Verwendung von static_assert innerhalb Eine Funktionsvorlage liefert eine klare Fehlermeldung, wenn die Funktion mit einem unerwarteten Parametertyp aufgerufen wird.
Das obige ist der detaillierte Inhalt vonWie kann ich implizite Konvertierungen in nicht konstruierenden Funktionen in C verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!