śr., 7 paź 2020 o 17:11 Antony Polukhin
Interesting. I do not understand enough about the implementation to be making definite statements, but based on my superficial knowledge I expect
ср, 7 окт. 2020 г. в 15:48, Andrzej Krzemienski
: that it should be possible to reimplement a "flat" reflection on top of "precise" one. 1. First you call structure_to_tuple() and you get std::tuple
2. For every Tn that is an aggregate type you apply structure_to_tuple() recursively. 3. Then you potentially get a tuple of nested tuples and you need to flatten it. Yes, that's doable. But is that really a popular feature?
Flat representation was useful, because there was no precise representation in the early versions of the library. That was the only way to do things.
Back to your example:
struct Person { std::string firstName; std::string lastName; int age; };
struct Employee : Person { double salary; };
struct Prisoner : Person { int cellNumber; };
Probably composition would work better than inheritance for your needs?
struct Person { std::string firstName; std::string lastName; int age; };
struct Employee { Person person; double salary; };
struct Prisoner { Person person; int cellNumber; };
With composition you get more flexibility:
std::ostream& operator<<(std::ostream& os, const Person& p) { os << "person: "; pfr::write(os, p); return os; }
std::ostream& operator<<(std::ostream& os, const Prisoner& p) { using pfr::ops; return os << p; }
// Outputs: {person: {"Harley ", "Quinn", 21}, 100500} std::cout << Prinsoner{{"Harley ", "Quinn", 21}, 100500};
I admit that the motivation for the flat reflection is much smaller than for the precise one, so in the end it may not be worth the effort. Regards, &rzej;