Код IT
← Каталог

Типы данных в C++ — SFINAE — Substitution Failure Is Not An Error

Фрагмент из «Типы данных в C++»: SFINAE — Substitution Failure Is Not An Error.

C++ main.cpp
// Вспомогательный 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));
}