Heim > Backend-Entwicklung > C++ > Wie kann ich implizite Konvertierungen in nicht konstruierenden Funktionen in C verhindern?

Wie kann ich implizite Konvertierungen in nicht konstruierenden Funktionen in C verhindern?

Linda Hamilton
Freigeben: 2024-12-03 08:18:18
Original
271 Leute haben es durchsucht

How Can I Prevent Implicit Conversions in Non-Constructing Functions in C  ?

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
Nach dem Login kopieren

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)
{}
Nach dem Login kopieren

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");
} 
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage