Serialization
#include <print> template<typename T> void serialize(const T& obj, std::ostream& os) { for_each(reflect(T), [&](auto member) { std::print("{}: {}\n", member.name(), member.get(obj)); }); }
class Person { public: Person(const std::string& name, int age) : name(name), age(age) {} std::string getName() const { return name; } void setName(const std::string& name) { this->name = name; } int getAge() const { return age; } void setAge(int age) { this->age = age; } private: std::string name; int age; REFLECT_PROPERTIES( (name, "Name of the person"), (age, "Age of the person") ) }; int main() { Person person("Alice", 30); auto properties = reflect::getProperties<Person>(); for (const auto& prop : properties) { std::print("Property: {} ({})\n", prop.name, prop.description); auto value = reflect::get(person, prop.name); std::print("Value: {}\n", value); if (prop.name == "age") { reflect::set(person, prop.name, 31); } } std::print("Updated age: {}\n", person.getAge()); return 0; }
template<typename T> void printTypeInfo() { constexpr auto info = reflect(T); std::print("Type name: {}\n", info.name()); std::print("Member count: {}\n", info.members().size()); }
template<typename T> void printAllMembers(const T& obj) { for_each(reflect(T), [&](auto member) { std::print("{}: {}\n", member.name(), member.get(obj)); }); }
Happily using iostreams since Turbo C++ 1.0 for MS-DOS in 1993, and will keep doing so, unless chasing ms optimizations.
I guess that's not what you wanted to say, but I fully agree :)
Serialization
Simplified property systems Simplified template metaprogramming Generic algorithm for printing all members