Boost logo

Boost :

From: Andrzej Krzemienski (akrzemi1_at_[hidden])
Date: 2020-10-07 07:58:45


śr., 7 paź 2020 o 09:22 Rainer Deyke via Boost <boost_at_[hidden]>
napisał(a):

> On 06.10.20 21:50, Andrzej Krzemienski via Boost wrote:
> > struct Person {
> > std::string firstName;
> > std::string lastName;
> > int age;
> > };
> >
> > struct Employee : Person {
> > double salary;
> > };
> >
> > struct Prisoner : Person {
> > int cellNumber;
> > };
> > ```
> > This (a) avoids duplication, and (b) I have the slicing do exactly what I
> > need: convert an Employee to a Person. Now, I am disappointed with what
> > C++17 did to aggregate initialization. My natural expectation would be
> that:
> >
> > ```
> > Employee e {"Bilbo", "Baggins", 111, 1000.00};
> > ```
> > Flattens the class hierarchy and initializes each of the four members.
> > Apparently , the C++ committee has a different vision for it. But I have
> > noticed that if I changed derivation into aggregation (as I indicated
> > earlier), the "flat" part of FPR would do exactly what I needed.
>
> Does that example really work? My expectation would be that flat
> reflection would try to break apart the std::strings, and fail with a
> compile-time error because std::string is not an aggregate.
>
> If it does work, then flat reflection is a lot more useful than I had
> initially thought!
>

The following compiles and outputs "1 2 3 " on my GCC compiler:

```
struct A {
  int x, y;
};

struct B {
  A a;
  int z;
};

int main()
{
  B b = {{1, 2}, 3};
  boost::pfr::flat_for_each_field(b, [](auto const& field){ std::cout <<
field << " "; });
}
```

However, when I substitute strings for ints it no longer compiles. I am not
sure if this is just a bug in the implementation or an inherent limitation
of this library.

Regards,
&rzej;


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk