Я хочу написать общую библиотеку сериализации, которая обеспечивает, например, общая функция save
.
Библиотека содержит пользовательские типы, например. some_condition
:
template <typename T>
struct some_condition
{
constexpr static bool value = std::is_same<std::string, T>::value ||std::is_arithmetic<T>::value ;
};
save
поведение выбирается на основе 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
должен настраиваться для пользовательских типов данных не только при перегрузке, но и в общих чертах через признаки.
Поэтому я создал trait_extension
, который может быть специализирован для шаблонов шаблонов:
template <template<typename> class Trait, typename T>
struct trait_extension : Trait<T>
{
}
save
должен быть соответствующим образом изменен:
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) { ... }
Теперь пользователь может предоставить свою специализацию 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;
};
Мой вопрос::
Есть ли "лучший" /более элегантный способ реализовать расширяемые черты?