Heim >Backend-Entwicklung >C++ >Wie können wir eine Vorlagenauswahl basierend auf dem Fehlen einer Funktion in der C-Metaprogrammierung implementieren?
Metaprogrammierung: Vorlagenauswahl basierend auf Funktionsüberladung
In der C-Metaprogrammierung ist die bedingte Definition von Vorlagenfunktionen basierend auf Typeigenschaften eine gängige Technik. In manchen Fällen kann es jedoch schwierig sein, das umgekehrte Szenario zu definieren, bei dem eine Vorlage aufgrund des Fehlens einer bestimmten Funktion ausgewählt wird.
Konkret besteht das Ziel im bereitgestellten Beispiel darin, eine Vorlage zu definieren Funktion stringify, die zwischen zwei Implementierungen auswählt:
Das Problem entsteht, wenn versucht wird, die letztere Bedingung auszudrücken. Der folgende erfolglose Versuch versucht, verschachtelte enable_if-Vorlagen zu verwenden, um zu überprüfen, ob to_string nicht definiert ist:
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Um dieses Problem zu lösen, können wir Walter Browns Typmerkmal void_t verwenden:
template <typename...> using void_t = void;<p> Auf diese Weise können wir das Merkmal has_to_string definieren als folgt:</p> <pre class="brush:php;toolbar:false">template<typename T, typename = void> struct has_to_string : std::false_type { }; template<typename T> struct has_to_string<T, void_t<decltype(std::to_string(std::declval<T>()))> > : std::true_type { };
Jetzt kann die Stringify-Vorlage mithilfe einer bedingten Vorlagenspezialisierung basierend auf dem Merkmal has_to_string definiert werden:
template<typename T> enable_if_t<has_to_string<T>::value, string> stringify(T t){ return std::to_string(t); } template<typename T> enable_if_t<!has_to_string<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Diese Lösung wählt effektiv die geeignete Implementierung von Stringify basierend darauf aus, ob std::to_string ist für den angegebenen Typ definiert.
Das obige ist der detaillierte Inhalt vonWie können wir eine Vorlagenauswahl basierend auf dem Fehlen einer Funktion in der C-Metaprogrammierung implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!