← Каталог
Типы данных в C++ — SFINAE — Substitution Failure Is Not An Error
Фрагмент из «Типы данных в C++»: SFINAE — Substitution Failure Is Not An Error.
// Вспомогательный trait: имеет ли T метод void serialize() const?
template<typename T, typename = void>
struct has_serialize : std::false_type {};
template<typename T>
struct has_serialize<T, std::void_t<decltype(std::declval<const T&>().serialize())>>
: std::true_type {};
// Перегрузки:
template<typename T>
std::enable_if_t<has_serialize_v<T>> save(const T& obj) {
obj.serialize(); // безопасно — перегрузка доступна только если serialize существует
}
template<typename T>
std::enable_if_t<!has_serialize_v<T>> save(const T& obj) {
// fallback: например, бинарная запись
write_bytes(reinterpret_cast<const char*>(&obj), sizeof(obj));
} // Вспомогательный trait: имеет ли T метод void serialize() const?
template<typename T, typename = void>
struct has_serialize : std::false_type {};
template<typename T>
struct has_serialize<T, std::void_t<decltype(std::declval<const T&>().serialize())>>
: std::true_type {};
// Перегрузки:
template<typename T>
std::enable_if_t<has_serialize_v<T>> save(const T& obj) {
obj.serialize(); // безопасно — перегрузка доступна только если serialize существует
}
template<typename T>
std::enable_if_t<!has_serialize_v<T>> save(const T& obj) {
// fallback: например, бинарная запись
write_bytes(reinterpret_cast<const char*>(&obj), sizeof(obj));
}