|
Boost : |
From: Andrzej Krzemienski (akrzemi1_at_[hidden])
Date: 2020-10-07 08:05:53
År., 7 paź 2020 o 09:58 Andrzej Krzemienski <akrzemi1_at_[hidden]> napisaÅ(a):
>
>
> Å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.
>
Oh, I know why it is doing this. In general, the library cannot know to
what level the user wants her structure to be flattened:
```
struct W {
// you do not know what is inside
};
ostream& operator<<(ostream&, const W&);
struct A {
W x, y;
};
struct B {
A a;
W z;
};
int main()
{
B b = {{w1, w2}, w3};
boost::pfr::flat_for_each_field(b, [](auto const& field){ std::cout <<
field << " "; });
}
```
Here, it is not clear whether you want to just print the W, or flatten it
further down if it happens to be an aggregate.
So maybe the "flat" part in PFR cannot solve my problem.
Regards,
&rzej;
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk