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&>(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!