Namespaces
Variants

std:: tuple

From cppreference.net
Utilities library
Определено в заголовочном файле <tuple>
template < class ... Types >
class tuple ;
(начиная с C++11)

Шаблон класса std::tuple представляет собой коллекцию фиксированного размера, содержащую гетерогенные значения. Это обобщение std::pair .

Если std:: is_trivially_destructible < Ti > :: value равно true для каждого Ti в Types , деструктор std::tuple является тривиальным.

Если программа объявляет явную или частичную специализацию std::tuple , программа является некорректной, диагностика не требуется.

Содержание

Параметры шаблона

Types... - типы элементов, которые хранит кортеж. Поддерживается пустой список.

Функции-члены

создаёт новый tuple
(public member function)
присваивает содержимое одного tuple другому
(public member function)
обменивает содержимое двух tuple s
(public member function)

Функции, не являющиеся членами класса

(C++11)
создает объект tuple типа, определенного типами аргументов
(шаблон функции)
(C++11)
создает tuple ссылок на lvalue или распаковывает tuple в отдельные объекты
(шаблон функции)
создает tuple из forwarding references
(шаблон функции)
(C++11)
создает tuple путем конкатенации любого количества кортежей
(шаблон функции)
обращается к указанному элементу tuple
(шаблон функции)
(удален в C++20) (удален в C++20) (удален в C++20) (удален в C++20) (удален в C++20) (C++20)
лексикографически сравнивает значения в tuple
(шаблон функции)
специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные концепции

указывает, что тип реализует tuple protocol
( std::get , std::tuple_element , std::tuple_size )
( exposition-only concept* )

Вспомогательные классы

получает размер

tuple
(специализация шаблона класса)

получает тип указанного элемента
(специализация шаблона класса)
специализирует std::uses_allocator type trait
(специализация шаблона класса)
определяет общий ссылочный тип tuple и tuple-like типа
(специализация шаблона класса)
определяет общий тип tuple и tuple-like типа
(специализация шаблона класса)
поддержка форматирования для tuple
(специализация шаблона класса)
(C++11)
заполнитель для пропуска элемента при распаковке tuple с использованием tie
(константа)

Специализации вспомогательных функций

template < class ... Ts >

constexpr bool enable_nonlocking_formatter_optimization < std :: tuple < Ts... >>

= ( enable_nonlocking_formatter_optimization < Ts > && ... ) ;
(начиная с C++23)

Эта специализация std::enable_nonlocking_formatter_optimization позволяет эффективную реализацию std::print и std::println для вывода объекта tuple когда каждый тип элемента поддерживает её.

Руководства по выводу (начиная с C++17)

Примечания

Поскольку "структура" кортежа – его размер, типы элементов и порядок этих типов – являются частью его сигнатуры типа, все они должны быть доступны во время компиляции и могут зависеть только от другой информации времени компиляции. Это означает, что многие условные операции с кортежами – в частности, условное добавление в начало/конец и фильтрация – возможны только если условия могут быть вычислены во время компиляции. Например, для std :: tuple < int , double , int > возможно фильтровать по типам – например, возвращая std :: tuple < int , int > – но невозможно фильтровать по признаку положительности каждого элемента (что имело бы разную сигнатуру типа в зависимости от значений кортежа в runtime), за исключением случая, когда все элементы сами являются constexpr .

В качестве обходного решения можно работать с кортежами из std:: optional , но всё ещё нет возможности изменять размер на основе информации времени выполнения.

До N4387 (применённого как отчёт о дефекте для C++11), функция не могла возвращать кортеж используя copy-list-initialization:

std::tuple<int, int> foo_tuple()
{
    return {1, -1};  // Ошибка до N4387
    return std::tuple<int, int>{1, -1}; // Всегда работает
    return std::make_tuple(1, -1); // Всегда работает
}

Пример

#include <iostream>
#include <stdexcept>
#include <string>
#include <tuple>
std::tuple<double, char, std::string> get_student(int id)
{
    switch (id)
    {
        case 0: return {3.8, 'A', "Lisa Simpson"};
        case 1: return {2.9, 'C', "Milhouse Van Houten"};
        case 2: return {1.7, 'D', "Ralph Wiggum"};
        case 3: return {0.6, 'F', "Bart Simpson"};
    }
    throw std::invalid_argument("id");
}
int main()
{
    const auto student0 = get_student(0);
    std::cout << "ID: 0, "
              << "GPA: " << std::get<0>(student0) << ", "
              << "grade: " << std::get<1>(student0) << ", "
              << "name: " << std::get<2>(student0) << '\n';
    const auto student1 = get_student(1);
    std::cout << "ID: 1, "
              << "GPA: " << std::get<double>(student1) << ", "
              << "grade: " << std::get<char>(student1) << ", "
              << "name: " << std::get<std::string>(student1) << '\n';
    double gpa2;
    char grade2;
    std::string name2;
    std::tie(gpa2, grade2, name2) = get_student(2);
    std::cout << "ID: 2, "
              << "GPA: " << gpa2 << ", "
              << "grade: " << grade2 << ", "
              << "name: " << name2 << '\n';
    // C++17 structured binding:
    const auto [gpa3, grade3, name3] = get_student(3);
    std::cout << "ID: 3, "
              << "GPA: " << gpa3 << ", "
              << "grade: " << grade3 << ", "
              << "name: " << name3 << '\n';
}

Вывод:

ID: 0, GPA: 3.8, grade: A, name: Lisa Simpson
ID: 1, GPA: 2.9, grade: C, name: Milhouse Van Houten
ID: 2, GPA: 1.7, grade: D, name: Ralph Wiggum
ID: 3, GPA: 0.6, grade: F, name: Bart Simpson

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2796 C++11 тривиальность деструктора std::tuple не была указана указана
LWG 3990 C++11 программа могла объявлять явную или
частичную специализацию std::tuple
программа является некорректной в этом
случае (диагностика не требуется)

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 22.4 Кортежи [tuple]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 20.5 Кортежи [tuple]
  • Стандарт C++17 (ISO/IEC 14882:2017):
  • 23.5 Кортежи [tuple]
  • Стандарт C++14 (ISO/IEC 14882:2014):
  • 20.4 Кортежи [tuple]
  • Стандарт C++11 (ISO/IEC 14882:2011):
  • 20.4 Кортежи [tuple]

Смотрите также

реализует бинарный кортеж, т.е. пару значений
(шаблон класса)