23 General utilities library [utilities]

23.5 Tuples [tuple]

23.5.3 Class template tuple [tuple.tuple]

23.5.3.4 Tuple creation functions [tuple.creation]

В нижеследующих описаниях функций элементы пакета параметровXTypes обозначаются по порядку с помощьюXi fori in[0, sizeof...(XTypes)) , где индексирование начинается с нуля.

template<class... TTypes> constexpr tuple<VTypes...> make_tuple(TTypes&&... t);

ПакетVTypes определяется следующим образом. ПустьUi будетdecay_­t<Ti> для каждого Ti вTTypes. ЕслиUi - это специализация reference_­wrapper, тоVi вVTypes -Ui​::​type&, иначеVi -Ui.

Returns:tuple<VTypes...>(std​::​forward<TTypes>(t)...).

[Example:

int i; float j;
make_tuple(1, ref(i), cref(j))

создает кортеж типаtuple<int, int&, const float&>. ] end example

template<class... TTypes> constexpr tuple<TTypes&&...> forward_as_tuple(TTypes&&... t) noexcept;

Effects: Создает кортеж ссылок на аргументы,t пригодный для пересылки в качестве аргументов функции. Поскольку результат может содержать ссылки на временные переменные, программа должна гарантировать, что возвращаемое значение этой функции не переживет ни один из ее аргументов (например, программа обычно не должна сохранять результат в именованной переменной).

Returns:tuple<TTypes&&...>(std​::​forward<TTypes>(t)...).

template<class... TTypes> constexpr tuple<TTypes&...> tie(TTypes&... t) noexcept;

Returns:tuple<TTypes&...>(t...). Когда аргумент вt isignore, присвоение любого значения соответствующему элементу кортежа не имеет никакого эффекта.

[ Example: tie функции позволяют создавать кортежи, которые распаковывают кортежи в переменные.ignore можно использовать для элементов, которые не нужны:

int i; std::string s;
tie(i, ignore, s) = make_tuple(42, 3.14, "C++");
// i == 42, s == "C++"

end example]

template <class... Tuples> constexpr tuple<CTypes...> tuple_cat(Tuples&&... tpls);

В следующих параграфах пустьTi будетith типомTuples, Ui бытьremove_­reference_­t<Ti>иtpi будетith параметром в пакете параметров функцииtpls, где все индексации отсчитываются от нуля.

Requires: Для всехi,Ui должен быть тип cvituple<Argsi...>, гдеcvi это (возможно , пустой) и является параметром пакет , представляющий типы элементов в . Позвольте быть типом в . Для всех должны быть выполнены следующие требования: ith cv-qualifier-seqArgsi UiAik kth ArgsiAik

  • ЕслиTi выводится как ссылочный тип lvalue, то в is_­constructible_­v<Aik, cviAik&> == trueпротивном случае

  • is_­constructible_­v<Aik, cviAik&&> == true.

Remarks: Типы вCTypes должны быть равны упорядоченной последовательности расширенных типов Args0..., Args1..., , Argsn1..., гдеn равноsizeof...(Tuples). Позвольтеei... бытьith упорядоченной последовательностью элементов кортежа результирующегоtuple объекта, соответствующей последовательности типовArgsi.

Returns: tuple Объект , построенный по инициализацииkith элемента типаeik вei... с

get<ki>(std::forward<Ti>(tpi))

для каждой действующейki и каждой группыei по порядку.

[ Note: Реализация может поддерживать дополнительные типы в пакете параметров,Tuples которые поддерживаютtuple-подобный протокол, такие как pair иarray. ] end note