Heim >Backend-Entwicklung >C++ >Wie können wir eine Vorlagenauswahl basierend auf dem Fehlen einer Funktion in der C-Metaprogrammierung implementieren?

Wie können wir eine Vorlagenauswahl basierend auf dem Fehlen einer Funktion in der C-Metaprogrammierung implementieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 20:36:02382Durchsuche

How Can We Implement Template Selection Based on the Absence of a Function in C   Metaprogramming?

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:

  • Wenn std::to_string für den angegebenen Typ definiert ist, verwenden Sie to_string(t), um den Wert in a zu konvertieren string.
  • Wenn std::to_string nicht für den Typ definiert ist, verwenden Sie ostringstream() << t.

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!

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