Desidero scrivere una libreria di serializzazione generica che fornisce ad es. una funzione generica save
. La libreria contiene tratti di tipo personalizzato, ad es. some_condition
:Caratteri estensibili di tipo in C++
template <typename T>
struct some_condition
{
constexpr static bool value = std::is_same<std::string, T>::value ||std::is_arithmetic<T>::value ;
};
s' save
viene selezionato in base some_condition
:
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
sarà personalizzabile per i tipi di dati degli utenti, non solo attraverso il sovraccarico, ma anche genericamente tramite tratti. Quindi ho creato trait_extension
che può essere specializzata per i tratti modelli:
template <template<typename> class Trait, typename T>
struct trait_extension : Trait<T>
{
}
save
deve essere modificato di conseguenza:
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) { ... }
Un utente potrebbe ora fornire la propria specializzazione delle 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;
};
La mia domanda ::
Esiste un modo "migliore"/più elegante per realizzare i tratti estensibili?
Non sarebbe più semplice avere un "caso generale" in cui is_string è definito come falso e le specializzazioni definiscono qualsiasi cosa è considerata una stringa? – OMGtechy
Hai consultato [C++ Container Pretty-Printer] (https://github.com/louisdx/cxx-prettyprint) come riferimento? – ildjarn
"Tuttavia, ciò funzionerà solo se la specializzazione' trait_extension' esiste prima di 'print'." Eh? –