Skip to content

The rfl::Field-syntax

As we have shown, reflect-cpp can automatically retrieve field names from structs.

However, it also possible to annotate the fields using rfl::Field, like this:

struct Person {
    rfl::Field<"firstName", std::string> first_name;
    rfl::Field<"lastName", std::string> last_name;
    rfl::Field<"children", std::vector<Person>> children;
};

These annotations are required if you are planning to use a compiler other than MSVC, GCC or clang.

There are a two things you have to keep in mind:

1) If you annotate some of the fields using rfl::Field, then you must annotate all of them. 2) If you are combining structs using rfl::Flatten, then they structs combined like this must either be annotated or not.

You can initilize your struct like this:

const auto bart = Person{.first_name = "Bart",
                         .last_name = "Simpson",
                         .children = std::vector<Person>()};

Note that all fields must be explicitly set. This is on purpose, because it prevents you from accidentally forgetting fields, which can lead to tricky runtime errors.

You can initialize a field using rfl::default_value:

const auto bart = Person{.first_name = "Bart",
                         .last_name = "Simpson",
                         .children = rfl::default_value};

You can also initialize fields in the struct declaration itself:

struct Person {
    rfl::Field<"firstName", std::string> first_name;
    rfl::Field<"lastName", std::string> last_name = "Simpson";
    rfl::Field<"children", std::vector<Person>> children = rfl::default_value;
};

Because you now have explicitly set those fields, you do not have to do this every time:

const auto bart = Person{.first_name = "Bart"};

const auto lisa = Person{.first_name = "Lisa"};

const auto maggie = Person{.first_name = "Maggie"};

const auto homer = Person{.first_name = "Homer",
                          .children = std::vector<Person>({bart, lisa, maggie})};

You can write this to a JSON string:

const auto json_string = rfl::json::write(homer);
{"firstName":"Homer","lastName":"Simpson","children":[{"firstName":"Bart","lastName":"Simpson","children":[]},{"firstName":"Lisa","lastName":"Simpson","children":[]},{"firstName":"Maggie","lastName":"Simpson","children":[]}]}

And you can parse it back into a struct:

const auto homer = rfl::json::read<Person>(json_string).value();