Metaprogrammierung: Spezialisierung basierend auf Überlastungsauflösung
In der Metaprogrammierung ist es üblich, Vorlagen basierend auf Typeigenschaften zu definieren. Allerdings entsteht eine Herausforderung, wenn versucht wird, zwischen zwei Vorlagendefinitionen auszuwählen, je nachdem, ob eine bestimmte Überladung für einen bestimmten Typ definiert ist.
Walter Brown führt einen nützlichen Typ ein, void_t, der void zurückgibt, wenn keine Vorlagenargumente bereitgestellt werden . Aufbauend auf diesem Konzept können wir ein Typmerkmal definieren, um das Vorhandensein der std::to_string-Überladung für einen bestimmten Typ zu überprüfen:
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 { };
Mit diesem Typmerkmal können wir jetzt ganz einfach eine Vorlage schreiben, die ist auf die Überladungsauflösung für std::to_string:
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(); }
Das obige ist der detaillierte Inhalt vonWie können Sie Vorlagen basierend auf der Überlastungsauflösung spezialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!