8 General utilities library [utilities]

8.5 Tagged tuple-like types [taggedtup]

8.5.5 Alias template tagged_tuple [tagged.tuple]

Header <experimental/ranges/tuple> synopsis

namespace std { namespace experimental { namespace ranges { inline namespace v1 {
  template <TaggedType... Types>
  using tagged_tuple = tagged<tuple<TAGELEM(Types)...>,
                              TAGSPEC(Types)...>;

  template <TagSpecifier... Tags, class... Types>
    requires sizeof...(Tags) == sizeof...(Types)
      constexpr see below make_tagged_tuple(Types&&... t);
}}}}
template <TaggedType... Types>
using tagged_tuple = tagged<tuple<TAGELEM(Types)...>,
                            TAGSPEC(Types)...>;

Example:

// See [alg.tagspec]:
tagged_tuple<tag::in(char*), tag::out(char*)> t{0, 0};
assert(&t.in() == &get<0>(t));
assert(&t.out() == &get<1>(t));

 — end example ]

8.5.5.1 Tagged tuple creation functions [tagged.tuple.creation]

template <TagSpecifier... Tags, class... Types> requires sizeof...(Tags) == sizeof...(Types) constexpr see below make_tagged_tuple(Types&&... t);

Let T be the type of make_tuple(std::forward<Types>(t)...). Then the return type is tagged<T, Tags...>.

Returns: tagged<T, Tags...>(std::forward<Types>(t)...).

Example:

int i; float j;
make_tagged_tuple<tag::in1, tag::in2, tag::out>(1, ref(i), cref(j))

creates a tagged tuple of type

tagged_tuple<tag::in1(int), tag::in2(int&), tag::out(const float&)>

 — end example ]