-
Notifications
You must be signed in to change notification settings - Fork 15k
Description
Bugzilla Link | 46704 |
Version | trunk |
OS | All |
CC | @apolukhin,@riccibruno,@zygoloid |
Extended Description
(Submitting simultaneous requests for each of Clang, GCC and MSVC.
Coordination between vendors will be beneficial for portability.)
Please add a builtin to count the bindings in [dcl.struct.bind].
A structured-bindable object has one of three types T:
Case 1: array type
Case 2: tuple access protocol; tuple_size<T>
, tuple_element<I,T>
, get<I>
Case 3: else, class types with restricted member data location & access
P2141 "Aggregates are named tuples" proposes automatic tuple-like protocol
for Case 3 types, in particular a generalisation of std::tuple_size
.
This request is for a builtin exposing the field count of a Case 3 type
(so can be used to implement P2141's generalized std::tuple_size
).
Counting bindings is key; it immediately opens up binding-based reflection.
Specification points (to be discussed & agreed between implementors)
Naming suggestions: __builtin_tuple_size, __builtin_binding_count ?
What value type? What value for an unsupported, non-bindable type?
Should the builtin work for Case 1 array and/or Case 2 tuple-like T?
E.g. given a statement SB<T,N> : auto&& [b1,... bN] = std::declval<T>();
decomposing a T
into N
bindings:
- If
SB<T,N>
is well formed then the builtin evaluates to integer constantN
- Else If
T
is an empty class type then evaluate to0
- Else evaluate to
-1 ?? size_t(-1) ?? false ??
The empty class type exception is a convenience (c.f. std::is_empty<T>
)
and future-proofing in case variadic bindings allow the empty pack case.
What about access - should the builtin be sensitive to scope?
(I think not.)(c.f. P0969 DR allowing binding to accessible members.)
Please discuss with other implementors and agree on a portable builtin.
Thanks for your consideration.
GCC ticket https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96185
MSVC https://developercommunity.visualstudio.com/idea/1111203/enhancement-please-add-a-builtin-to-count-bindings.html#