Erzwingen der Typkonsistenz in variadischen Funktionen ohne zusätzliche Strukturen
Variadische Funktionen und variadische Vorlagenfunktionen ermöglichen es uns, eine variable Anzahl von Argumenten an a zu übergeben Funktion. Es kann jedoch eine Herausforderung sein, sicherzustellen, dass alle Argumente denselben Typ haben. Diese Frage untersucht eine Lösung für dieses Problem ohne die Verwendung von Arrays, Vektoren oder Strukturen.
Variadic-Funktionsansatz
Die vorgeschlagene Lösung besteht darin, Argumente durch die Variadic-Vorlage zu akzeptieren und Lassen Sie die Typprüfung die Gültigkeit überprüfen, wenn sie konvertiert werden. Dieser Ansatz erfordert jedoch, dass wir über einen bekannten Konvertierungspfad zum gewünschten Typ verfügen. In diesem Fall muss es eine bekannte Möglichkeit geben, ein Array von Maiden in dragon_list_t umzuwandeln.
Beispiel:
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
SFINAE-Ansatz
SFINAE (Substitution Failure Is Not An Error) kann verwendet werden, um Typkonsistenz auf Funktionsschnittstellenebene durchzusetzen. Dadurch können wir ungültige Argumente frühzeitig im Überlastungslösungsprozess ablehnen.
Beispiel:
template<typename R, typename...> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
Schlussfolgerung
Beide Ansätze bieten eine Möglichkeit, einen Typ für alle an variadische Funktionen übergebenen Argumente anzugeben, ohne zusätzliche Datenstrukturen zu verwenden. Der variadische Funktionsansatz basiert auf bekannten Konvertierungspfaden, während der SFINAE-Ansatz eine Überlastungsauflösung ermöglicht, um ungültige Argumente abzulehnen. Die Wahl zwischen diesen Ansätzen hängt von den Anforderungen des jeweiligen Anwendungsfalls ab.
Das obige ist der detaillierte Inhalt vonWie kann die Typkonsistenz in variadischen Funktionen ohne zusätzliche Strukturen erzwungen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!