This change updates the BestReflect() tagging API to not require the tap operator (->*) or calls to best::vals<> to manually hoist arguments into the type system.
Instead, we observe that all of the requisite information for building a type descriptor with tags is already present at constexpr time, and therefore can all be hoisted into a template <const auto&>. If we add an extra reification step, we can record field keys (e.g. ptrs-to-member) as data members in the mirror object returned by BestReflect(), put the mirror object into a constexpr variable, then pass that to the function that constructs the complete type descriptor as a non-type template argument.
Additionally, this change adds:
best::abridge<T>, a symbol abridgement helper.
best::mirror::with(tags), for adding tags directly to the reflected type, not one of its fields.
This change updates the
BestReflect()
tagging API to not require the tap operator (->*
) or calls tobest::vals<>
to manually hoist arguments into the type system.Instead, we observe that all of the requisite information for building a type descriptor with tags is already present at
constexpr
time, and therefore can all be hoisted into atemplate <const auto&>
. If we add an extra reification step, we can record field keys (e.g. ptrs-to-member) as data members in the mirror object returned byBestReflect()
, put the mirror object into aconstexpr
variable, then pass that to the function that constructs the complete type descriptor as a non-type template argument.Additionally, this change adds:
best::abridge<T>
, a symbol abridgement helper.best::mirror::with(tags)
, for adding tags directly to the reflected type, not one of its fields.