Хотите безопасную сериализацию? Создайте концепт для проверки того, что тип можно сериализовать и десериализовать.
✏️ Создание концепта:
1️⃣ Определите требования к типу
2️⃣ Проверьте наличие методов
3️⃣ Используйте в шаблонах
#include <concepts>
#include <iostream>
#include <string>
#include <sstream>
// Концепт для сериализуемых типов
template<typename T>
concept Serializable = requires(T obj, std::ostream& os, std::istream& is) {
{ obj.serialize(os) } -> std::same_as<void>;
{ T::deserialize(is) } -> std::same_as<T>;
};
// Пример сериализуемого класса
struct Person {
std::string name;
int age;
void serialize(std::ostream& os) const {
os << name << " " << age;
}
static Person deserialize(std::istream& is) {
Person p;
is >> p.name >> p.age;
return p;
}
};
// Функция для работы с сериализуемыми объектами
template<Serializable T>
void save_and_load(const T& obj) {
std::stringstream ss;
// Сериализация
obj.serialize(ss);
std::cout << "Serialized: " << ss.str() << std::endl;
// Десериализация
T loaded = T::deserialize(ss);
std::cout << "Deserialized successfully" << std::endl;
}
// Использование
void example() {
Person p{"Alice", 25};
save_and_load(p); // ✅ Работает
// save_and_load(42); // ❌ Ошибка компиляции
}
😡 Частые ошибки:
❌ Забывают про static методы в концептах
❌ Не учитывают const-correctness
❌ Создают слишком жёсткие требования
⛄️ Практический совет:
✅Концепты помогают создавать self-documenting API и ловить ошибки на этапе компиляции.
Библиотека C/C++ разработчика #буст
