std::tuple
Определено в заголовочном файле <tuple> | ||
|---|---|---|
template< class... Types > class tuple; | (с C++11) |
Шаблон класса std::tuple представляет собой коллекцию фиксированного размера разнородных значений. Это обобщение std::pair.
Если std::is_trivially_destructible<Ti>::value является true для каждого Ti в Types, деструктор tuple тривиален.
Параметры шаблона
| Типы... | - | типы элементов, хранящихся в кортеже. Поддерживается пустой список. |
Члены класса
| создаёт новый кортеж (публичный член-функция) |
|
| присваивает содержимое одного кортежа другому (публичный член-функция) |
|
| меняет содержимое двух кортежей (публичный член-функция) |
Внешние функции
|
(C++11) | создаёт объект типа кортежа, определяемый типами аргументов (шаблон функции) |
|
(C++11) | создаёт кортеж ссылок на lvalues или распаковывает кортеж в отдельные объекты (шаблон функции) |
|
(C++11) | создаёт кортеж ссылок ссылок с передачей (шаблон функции) |
|
(C++11) | создаёт кортеж путём конкатенации любого числа кортежей (шаблон функции) |
|
(C++11) | доступ к элементу кортежа по указанному индексу (шаблон функции) |
|
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) | лексикографически сравнивает значения в кортеже (шаблон функции) |
|
(C++11) | специализация алгоритма std::swap (шаблон функции) |
Вспомогательные концепции
|
(C++23) | описывает тип, реализующий протокол кортежа ( std::get, std::tuple_element, std::tuple_size)(концепция для иллюстрации*) |
Вспомогательные классы
|
(C++11) | получает размер tuple во время компиляции (специализация шаблона класса) |
|
(C++11) | получает тип указанного элемента (специализация шаблона класса) |
|
(C++11) | специализация типа-трейта std::uses_allocator (специализация шаблона класса) |
|
(C++23) | определяет общий тип ссылки для tuple и tuple-like типов (специализация шаблона класса) |
|
(C++23) | определяет общий тип для tuple и tuple-like типов (специализация шаблона класса) |
|
(C++23) | поддержка форматирования для pair и tuple (специализация шаблона класса) |
|
(C++11) | плейсхолдер для пропуска элемента при распаковке кортежа с помощью tie (константа) |
Правила вывода типов (с C++17)
Примечания
- Поскольку «форма» кортежа — его размер, типы его элементов и порядок этих типов — являются частью его сигнатуры типа, они должны быть доступны на этапе компиляции и могут зависеть только от других сведений на этапе компиляции. Это означает, что многие условные операции над кортежами — в частности, условные операции добавления/удаления и фильтрации — возможны только в том случае, если условия могут быть проверены на этапе компиляции. Например, при работе с кортежем можно фильтровать типы — например, возвращая кортеж — но нельзя фильтровать по тому, является ли каждый элемент положительным (это имело бы разную сигнатуру типа в зависимости от значений кортежа во время выполнения), если все элементы сами не были
constexpr.- В качестве обходного пути можно работать с кортежами
std::optional, но всё ещё нет способа изменить размер на основе информации во время выполнения.
- В качестве обходного пути можно работать с кортежами
- До N4387 (применён как отчёт об ошибке для C++11) функция не могла возвращать кортеж с помощью инициализации списком копирования:
std::tuple<int, int> foo_tuple()
{
return {1, -1}; // Error until N4387
return std::tuple<int, int>{1, -1}; // Always works
return std::make_tuple(1, -1); // Always works
}Пример
#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++.
END_OF_DOCUMENT_MARKER| DR | Применимо к | Поведение, опубликованное в спецификации | Правильное поведение |
|---|---|---|---|
| LWG 2796 | C++11 | тривиальность деструктора tuple была не определена | определена |
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2023):
- 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]
См. также
| реализует двоичный кортеж, т.е. пару значений (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/tuple