Date: Mon, 31 Jan 2022 19:08:15 +0200
Daveed Vandevoorde wrote:
> > This reminds me of an observation I had: it would have been nice if we
> > could actually form pointer to member to a specific base class, so
> > that we can then reflect it.
>
> I can see how that could be useful: Extend the notion of pointer-to-member to
> also be able to designate bases.
>
> (That’s orthogonal to reflection though.)
>
>
> > Because as-is, if you have two bases of the same type, there's no way
> > you can differentiate between them just by their type.
>
> Even “not as is”: It’s an ambiguous question to ask?
It's not ambiguous if you have reflection information.
In Boost.Describe, I support a "modifier" mod_inherited, which includes the
inherited members in the "members_of" list. I don't currently support it for
the base classes, but I could. So when you have
struct B {};
struct D1: B {};
struct D2: B {};
struct C: D1, D2 {};
and you say describe_bases<C, mod_any_access | mod_inherited>, you would
get a list of base class descriptors [desc(D1), desc(B), desc(D2), desc(B)]. So you
have two descriptors about a base class of type B, but they refer to different
bases. And if the base class descriptor contained a member pointer to the base,
like data member descriptors contain a member pointer to the data member,
you would be able to go from C* to the first B* using the first pointer, and to
the second B* using the second pointer.
Not sure if this makes any sense. :-) I hope it does.
> > This reminds me of an observation I had: it would have been nice if we
> > could actually form pointer to member to a specific base class, so
> > that we can then reflect it.
>
> I can see how that could be useful: Extend the notion of pointer-to-member to
> also be able to designate bases.
>
> (That’s orthogonal to reflection though.)
>
>
> > Because as-is, if you have two bases of the same type, there's no way
> > you can differentiate between them just by their type.
>
> Even “not as is”: It’s an ambiguous question to ask?
It's not ambiguous if you have reflection information.
In Boost.Describe, I support a "modifier" mod_inherited, which includes the
inherited members in the "members_of" list. I don't currently support it for
the base classes, but I could. So when you have
struct B {};
struct D1: B {};
struct D2: B {};
struct C: D1, D2 {};
and you say describe_bases<C, mod_any_access | mod_inherited>, you would
get a list of base class descriptors [desc(D1), desc(B), desc(D2), desc(B)]. So you
have two descriptors about a base class of type B, but they refer to different
bases. And if the base class descriptor contained a member pointer to the base,
like data member descriptors contain a member pointer to the data member,
you would be able to go from C* to the first B* using the first pointer, and to
the second B* using the second pointer.
Not sure if this makes any sense. :-) I hope it does.
Received on 2022-01-31 17:08:17