rttrorg / rttr

C++ Reflection Library
https://www.rttr.org
MIT License
3.17k stars 439 forks source link

Recusive traversal of structs #293

Open perara opened 4 years ago

perara commented 4 years ago

Hi,

I'm trying to do a rather "simple" travels through nested structs, defined as follows:

struct State{
    float time = 0.0;
    int sequence = 0;
    int version = 1;
    Player player = Player();
    State(){};
};
struct Player{
    int level = 0;
    Player(){};
};

whereas I've defined the following registration


RTTR_REGISTRATION
{

    rttr::registration::class_<State>("State")
        .constructor<>()
        .property("time", &State::time)
        .property("sequence", &State::sequence)
        .property("version", &State::version)
        .property("player", &State::player)

    rttr::registration::class_<Player>("Player")
        .constructor<>()
       .property("level", &Player::level);

}

Now, I would like to traverse from State and visit all properties along the way:

1. State.sequence
2. State.version
3. State.player
4. Player.level

I am able to do this at "type level" but I would also like to set values along the way. How can I achieve this?

So far, I've been able to set up the following, which successfully traverse as I want, however, I also want to access properties of the objects along the way and set/get values.

 std::vector<std::string> types = {};
    std::list<rttr::type> queue = {rttr::type::get(state)};
    while(!queue.empty()){
        auto& cls = queue.front();
        queue.pop_front();

        for (auto& prop : cls.get_properties()){

            if(prop.get_type().is_class()){
                queue.push_back(rttr::type::get(prop));
                 // Here I find that the type is a class and I then wish to visit this and set values
            }else{
                types.emplace_back(prop.get_type().get_name());
               // Here I would like to set values. First check its type, then set values accordingly.
            }
        }

    }