Daily bit(e) of C++. std::tuple
Добавлено 19 июля 2026 в 14:45
Daily bit(e) C++ 34, гетерогенный контейнер фиксированного размера: std::tuple.

std::tuple – это гетерогенная коллекция элементов, обобщение std::pair.
В отличие от std::pair, std::tuple может содержать любое количество (включая отсутствие) элементов.
#include <tuple>
#include <vector>
#include <functional>
void function(int, int) {}
// пустой std::tuple
auto a = std::tuple{};
// std::tuple_size_v<decltype(a)> == 0
auto b = std::tuple{5,42}; // вывод аргументов шаблона класса
// выводит к std::tuple<int,int>
// для предварительного вывода аргументов шаблона класса вы можете
// использовать std::make_tuple(5, 42) для того же результата
// создать std::vector, используя элементы кортежа
// в качестве аргументов конструктора
auto v = std::make_from_tuple<std::vector<int>>(b);
// v == {42, 42, 42, 42, 42}
// вызвать функцию, используя элементы кортежа в качестве аргументов
std::apply(function, b); // вызывает function(5, 42)
// функции запроса/доступа
size_t cnt = std::tuple_size_v<decltype(b)>; // размер
// cnt == 2
using e_t = std::tuple_element_t<0, decltype(b)>; // тип элемента
// e_t == int
int e = std::get<0>(b); // значение элемента
// e == 5
// функция make_tuple поддерживает reference_wrapper для выражений ссылок
int x = 7, y = 42;
auto t1 = std::make_tuple(x,y);
// decltype(t1) == std::tuple<int,int>
auto t2 = std::make_tuple(std::ref(x),y);
// decltype(t2) == std::tuple<int&,int>
auto t3 = std::make_tuple(std::ref(x),std::cref(y));
// decltype(t3) == std::tuple<int&,const int&>
// forward_as_tuple создает кортеж из пробрасывающих ссылок
auto t4 = std::forward_as_tuple(std::move(x), std::move(y));
// decltype(t4) == std::tuple<int&&,int&&>
auto t5 = std::forward_as_tuple(x, std::move(y));
// decltype(t5) == std::tuple<int&,int&&>
// как и с std::pair, std::tuple можно деконструировать
// с помощью структурированных привязок
auto c = std::tuple{"Hello World!", 42, &a};
auto [msg, val, ptr] = c;
// msg == "Hello World!", val == 42, ptr == &a
