Heim  >  Artikel  >  Backend-Entwicklung  >  Wie definiere ich ein Typmerkmal für die Funktionsverfügbarkeit in C?

Wie definiere ich ein Typmerkmal für die Funktionsverfügbarkeit in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 10:48:02745Durchsuche

How to Define a Type Trait for Function Availability in C  ?

Metaprogrammierung: C-Funktionsdefinitionsfehler als separate Funktionsdefinition

In C ist es möglich, Metafunktionen basierend auf Typmerkmalen zu definieren. Beispielsweise kann man eine Vorlage definieren, um einen Wert in eine Zeichenfolge umzuwandeln, basierend darauf, ob der Werttyp arithmetisch ist:

template<typename T> 
enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
    return to_string(t);
}
template<typename T> 
enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
    return static_cast<ostringstream&amp;>(ostringstream() << t).str();
}

Dieser Ansatz basiert jedoch auf der Eigenschaft is_arithmetic des Typs. Ein wünschenswerterer Ansatz würde auf der Verfügbarkeit der Funktion std::to_string für den Typ basieren. Es ist jedoch schwierig, die folgende Anforderung als Typmerkmal auszudrücken:

„Wenn std::to_string für den Typ definiert ist, verwenden Sie ihn.“

Es ist möglich, die Kriterien für std zu deklarieren ::to_string-Verfügbarkeit:

template<typename T> 
decltype(to_string(T{})) stringify(T t){
    return to_string(t);
}

Aber es ist unklar, wie die entgegengesetzten Kriterien konstruiert werden sollen.

Verwenden Mit dem Typmerkmal void_t von Walter Brown ist es einfach, das gewünschte Typmerkmal zu definieren:

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 { };

Dieses Merkmal wertet aus, ob die Funktion std::to_string für einen bestimmten Typ definiert ist, was eine flexiblere Vorlagenauswahl basierend auf der Funktion ermöglicht Verfügbarkeit.

Das obige ist der detaillierte Inhalt vonWie definiere ich ein Typmerkmal für die Funktionsverfügbarkeit in C?. 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