Heim > Artikel > Backend-Entwicklung > Wie erzwinge ich einen einzelnen Argumenttyp für variadische Funktionen oder Vorlagen, ohne Container zu verwenden?
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!