Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erzwinge ich einen einzelnen Argumenttyp für variadische Funktionen oder Vorlagen, ohne Container zu verwenden?

Wie erzwinge ich einen einzelnen Argumenttyp für variadische Funktionen oder Vorlagen, ohne Container zu verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 00:11:03860Durchsuche

How to Enforce a Single Argument Type for Variadic Functions or Templates Without Using Containers?

Angeben eines einzelnen Argumenttyps für variadische Funktionen oder Vorlagen ohne Container

Beim Arbeiten mit variadischen Funktionen oder Vorlagenfunktionen kann es wünschenswert sein, dies zu tun Stellen Sie sicher, dass alle Argumente einem bestimmten Typ entsprechen und bei falscher Verwendung einen eindeutigen Fehler bei der Kompilierung anzeigen.

Variadische Funktionen

Variadische Funktionen, wie z. B. die printf-Familie , akzeptieren Sie eine variable Anzahl von Argumenten unterschiedlichen Typs. Allerdings fehlt ihnen die Typsicherheit, was es schwierig macht, einen bestimmten Typ für alle Argumente durchzusetzen.

Variadic-Vorlagenfunktionen

Variadic-Vorlagenfunktionen können durch den Vorlagentyp Typsicherheit bieten Parameter. Die Angabe eines Arrays oder Vektors des gewünschten Typs innerhalb der Vorlagenparameter führt jedoch zu einer unnötigen Komplexität der Funktionssignatur.

Lösung: Template Metaprogramming (SFINAE)

Zu erreichen Um die Typdurchsetzung ohne Verwendung von Containern zu ermöglichen, können Sie die Metaprogrammierung von Vorlagen und die SFINAE-Technik (Substitution Failure Is Not An Error) nutzen. Hier ist ein vereinfachtes Beispiel:

template<typename ToType, typename Arg>
struct is_convertible { static constexpr bool value = false; };

template<typename ToType, typename FromType>
struct is_convertible<ToType, FromType> : std::is_convertible<FromType, ToType> {};

template<typename ...Args>
void f(Args...) {
    // Check if all arguments are convertible to the desired type
    typename std::enable_if<
        is_convertible<ToType, Args>::value && ...
    >::type...;
}

In diesem Beispiel prüft die Vorlagenmetafunktion is_convertible, ob jedes Argument in den ToType-Typ konvertiert werden kann. Die f-Funktion verwendet dann SFINAE, um ihre Verwendung nur zu ermöglichen, wenn alle Argumente diese Bedingung erfüllen.

Verwendung

Um die Typbeschränkung für Ihre make_dragon_list-Funktion zu erzwingen, können Sie verwenden SFINAE wie folgt:

template<typename ToType, typename ...Args>
typename std::enable_if<
    is_convertible<ToType, Args>::value && ...
>::type
make_dragon_list(Args...);

Mit diesem Ansatz lehnt der Compiler jeden Versuch ab, Argumente falscher Typen zu übergeben, und liefert klare und frühzeitige Fehlermeldungen.

Das obige ist der detaillierte Inhalt vonWie erzwinge ich einen einzelnen Argumenttyp für variadische Funktionen oder Vorlagen, ohne Container zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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