std::experimental::ranges::tagged
From cppreference.com
                    
                                        
                    < cpp | experimental | ranges
                    
                                                            
                    |   Defined in header  <experimental/ranges/utility>
  | 
||
|   template< class Base, TagSpecifier... Tags >     requires sizeof...(Tags) <= std::tuple_size<Base>::value  | 
(ranges TS) | |
The class template tagged augments a tuple-like class type Base, which it publicly derives from, with a set of named accessors specified by the tag specifiers Tags.... The tags are applied in order: the i-th tag specifier in Tags... correspond to the i-th element of the tuple.
The tag specifiers in Tags... shall be unique. Otherwise, the behavior is undefined.
It is not possible to delete an instance of tagged through a pointer to any base other than Base.
Member functions
  construct a tagged object (public member function)  | |
   assigns a tagged object (public member function)  | |
   swaps the contents of two tagged objects (public member function)  | 
Named element accessors
For the N-th tag specifier in Tags... whose corresponding element name is name, tagged provides accessors named name as follows:
constexpr decltype(auto) name() & { return std::get<N>(*this); } constexpr decltype(auto) name() const & { return std::get<N>(*this); } constexpr decltype(auto) name() && { return std::get<N>(std::move(*this)); }
Non-member functions
   specializes swap for tagged objects (function)  | 
Tuple-like access
  obtains the size of a tagged (class template specialization)  | |
  obtains the types of the elements of a tagged (class template specialization)  | 
See also
|    specifies that a type is a tag specifier  (concept)  | |
|    alias template for a tagged std::pair   (alias template)  | |
   convenience function for creating a tagged_pair  (function template)  | |
|    alias template for a tagged std::tuple  (alias template)  | |
   convenience function for creating a tagged_tuple  (function template)  | |
|    tag specifiers for use with ranges::tagged  (class)  |