클로드코드에 예제 내놓으라고 함

뭐 지적하니까 바로 수정해서 신뢰성은 그닥이긴 함

복잡한 이름은 수정했음

#include <meta>
#include <print>
#include <string>

template <typename T>
void print_names_values(const T& obj);

template <typename T>
void print_names();

template <typename T, typename F>
void set_variable(T& obj, std::string_view name, F value);

struct Player {
    std::string name   = "Hero";
    int         hp     = 100;
    float       speed  = 3.5f;
    bool        active = true;
};

int main() {
    Player p;

    std::println("=== field names ===");
    print_names<Player>();

    std::println("\n=== serialize ===");
    print_names_values(p);

    std::println("\n=== set_field ===");
    set_variable(p, "hp", 999);
    serialize(p);
}


template <typename T>
void print_names() {
    template for (constexpr auto M : std::meta::nonstatic_data_members_of(^T)) {
        std::println("  {}", std::meta::name_of(M));
    }
}

template <typename T>
void print_names_values(const T& obj) {
    std::println("{{");
    template for (constexpr auto M : std::meta::nonstatic_data_members_of(^T)) {
        std::println("  \"{}\": {}", std::meta::name_of(M), obj.[:M:]);
    }
    std::println("}}");
}

template <typename T, typename F>
void set_variable(T& obj, std::string_view name, F value) {
    bool found = false;
    template for (constexpr auto M : std::meta::nonstatic_data_members_of(^T)) {
        if (std::meta::name_of(M) == name) {
            obj.[:M:] = static_cast<decltype(obj.[:M:])>(value);
            found = true;
        }
    }
    if (!found)
        std::println("[warn] field '{}' not found", name);
}

- dc official App