Ich möchte eine generische Serialisierung Bibliothek schreiben, die zum Beispiel liefert eine generische save
Funktion. Die Bibliothek enthält benutzerdefinierte Typenmerkmale, z. some_condition
:Extensible Typ Züge in C++
template <typename T>
std::enable_if_t<some_condition<T>::value> save(const T& value)
{
std::cout << "these types will be handled in a specific way: " << value << std::endl;
}
template <typename T>
std::enable_if_t<!some_condition<T>::value> save(const T& value)
{
std::cout << "these types will be handled in another way: " << value << std::endl;
}
save
soll sein kundengerecht für Benutzer-Datentypen, nicht nur über Überlastung, sondern auch allgemein über Merkmale:
template <typename T>
struct some_condition
{
constexpr static bool value = std::is_same<std::string, T>::value ||std::is_arithmetic<T>::value ;
};
save
‚s Verhalten basierend auf some_condition
ausgewählt. Deshalb habe ich trait_extension
die für Züge Vorlagen spezialisiert werden können:
template <template<typename> class Trait, typename T>
struct trait_extension : Trait<T>
{
}
save
hat entsprechend angepasst werden:
template <typename T>
std::enable_if_t<trait_extension<some_condition,T>::value> save(const T& value) { ... }
template <typename T>
std::enable_if_t<!trait_extension<some_condition,T>::value> save(const T& value) { ... }
Ein Benutzer könnte nun liefern seine eigene Spezialisierung trait_extension
:
template <typename T>
struct trait_extension<some_condition, T>
{
// user specific extension: exclude floats from condition
constexpr static bool value = !std::is_floating_point<T>::value && some_condition<T>::value;
};
Meine Frage ::
Gibt es eine „bessere“/elegante Art und Weise erweiterbar Züge zu realisieren?
Wäre es nicht einfacher sein, einen „allgemeinen Fall“ zu haben, wo is_string als falsch definiert ist, und haben Spezialisierungen definieren, was ein String betrachtet wird? – OMGtechy
Haben Sie sich den [C++ Container Pretty-Printer] (https://github.com/louisdx/cxx-prettyprint) als Referenz angesehen? – ildjarn
"Dies funktioniert jedoch nur, wenn die Spezialisierung' trait_extension' vor 'print' existiert." Hä? –