Heim > Backend-Entwicklung > C++ > Wie erzwingt man Typeinheitlichkeit in variadischen Funktionen?

Wie erzwingt man Typeinheitlichkeit in variadischen Funktionen?

Barbara Streisand
Freigeben: 2024-11-10 04:30:02
Original
321 Leute haben es durchsucht

How to Enforce Type Uniformity in Variadic Functions?

Gewährleistung der Einheitlichkeit der Argumenttypen in variadischen Funktionen

In diesem Szenario wollen wir eine Funktion erstellen, die eine variable Anzahl von Argumenten akzeptieren kann. Stellen Sie jedoch sicher, dass alle Argumente vom gleichen Typ sind. Wir versuchen dies zu erreichen, ohne auf zusätzliche Datenstrukturen wie Arrays oder Vektoren zurückzugreifen.

Variadische Funktionen

Variadische Funktionen allein bieten keine Typsicherheit für ihre Argumente. Um Typeinheitlichkeit zu erzwingen, sollten Sie den Einsatz variadischer Vorlagenfunktionen in Betracht ziehen.

Variadische Vorlagenfunktionen

Eine variadische Vorlagenfunktion kann wie folgt definiert werden:

template<typename... Args>
return_type function_name(Args...);
Nach dem Login kopieren

In dieser Vorlage stellt Args... die variable Anzahl von Argumenten dar, die an übergeben werden können Funktion.

Durchsetzung der Typprüfung

Um sicherzustellen, dass alle Argumente vom gleichen Typ sind, können wir SFINAE (Substitution Failure Is Not An Error) verwenden. Mit SFINAE können wir eine Vorlage erstellen, die während der Kompilierung erkennt, ob eine bestimmte Bedingung wahr oder falsch ist.

Hier ist ein Beispiel:

template<typename R, typename... Args>
struct fst { typedef R type; };

template<typename ...Args>
typename fst<void,
  typename enable_if<
    is_convertible<Args, ToType>::value
  >::type...
>::type
f(Args...);
Nach dem Login kopieren

In dieser Vorlage ist nur f() zulässig um Argumente zu akzeptieren, die in den Typ ToType konvertierbar sind (der den gewünschten Argumenttyp darstellt). Diese Konfiguration lehnt alle Argumente ab, die nicht in ToType konvertierbar sind.

Anwendungsfalllösung

Für Ihren spezifischen Anwendungsfall können Sie Folgendes verwenden:

template<typename ...Items>
dragon_list_t make_dragon_list(Items... maidens) {
    std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }};
    // here be dragons
}
Nach dem Login kopieren

Diese Vorlage konvertiert die variablen Argumente in ein Array vom Typ std::array. Anschließend können Sie alle verfügbaren Methoden verwenden, um dieses Array in Ihren Typ „dragon_list_t“ zu konvertieren.

Kombination mit SFINAE

Durch die Kombination dieses Ansatzes mit der zuvor beschriebenen SFINAE-Technik können Sie erstellen eine Vorlage, die alle Argumente ablehnt, die nicht in Maiden konvertierbar sind.

Das obige ist der detaillierte Inhalt vonWie erzwingt man Typeinheitlichkeit in variadischen Funktionen?. 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