std::tuple
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <tuple>
|
||
template< class... Типы > class tuple; |
(начиная с C++11) | |
Шаблон класса std::tuple представляет собой фиксированного размера набор разнородных значений. Это обобщение std::pair.
Если std::is_trivially_destructible<Ti>::value равно true для каждого Ti в Типы, деструктор tuple тривиален.
Параметры шаблона
| Типы... | — | типы элементов, которые хранятся в кортеже. Поддерживается пустой список. |
Функции элементы
создаёт новый tuple (public функция-элемент) | |
присваивает содержимое одного tuple другому (public функция-элемент) | |
меняет местами содержимое двух tuple местами (public функция-элемент) |
Функции, не являющиеся элементами
(C++11) |
создаёт объект tuple типа, определённого типами аргументов (шаблон функции) |
| создаёт std::tuple левосторонних ссылок или распаковывает кортеж на отдельные объекты (шаблон функции) | |
(C++11) |
создаёт tuple пересылалаемых ссылок (шаблон функции) |
(C++11) |
создаёт tuple, объединяя любое количество кортежей (шаблон функции) |
(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) (только для пояснения concept*) |
Вспомогательные классы
(C++11) |
получает размер tuple во время компиляции (специализация шаблона класса) |
| получает тип указанного элемента (специализация шаблона класса) | |
| специализация свойств типа std::uses_allocator (специализация шаблона класса) | |
определяет общий ссылочный тип tuple и tuple-like типов (специализация шаблона класса) | |
определяет общий тип tuple и tuple-like типов (специализация шаблона класса) | |
(C++11) |
заполнитель для пропуска элемента при распаковке tuple с помощью tie (константа) |
Правила вывода (начиная с C++17)
Примечание
- Поскольку "форма" кортежа -- его размер, типы его элементов и порядок этих типов -- являются частью сигнатуры его типа, все они должны быть доступны во время компиляции и могут зависеть только от другой информации времени компиляции. Это означает, что многие условные операции над кортежами, в частности условное добавление в начало/конец и фильтрация, возможны только в том случае, если условия могут быть оценены во время компиляции. Например, учитывая
std::tuple<int, double, int>, можно фильтровать по типам, например, возвращаяstd::tuple<int, int>, но не для фильтрации того, является ли каждый элемент положительным (который будет иметь другую сигнатуру типа в зависимости от значений кортежа времени выполнения), если только все элементы сами былиconstexpr.- В качестве обходного пути можно работать с кортежами
std::optional, но по-прежнему нет способа настроить размер на основе информации времени выполнения.
- В качестве обходного пути можно работать с кортежами
- До N4387 (применяемого как отчёт о дефектах для C++11), функция не могла вернуть кортеж, используя копирование-списка-инициализации:
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', "Лиза Симпсон"};
case 1: return {2.9, 'C', "Милхаус Ван Хаутен"};
case 2: return {1.7, 'D', "Ральф Виггам"};
case 3: return {0.6, 'F', "Барт Симпсон"};
}
throw std::invalid_argument("id");
}
int main()
{
const auto student0 = get_student(0);
std::cout << "ИД: 0, "
<< "Средний балл: " << std::get<0>(student0) << ", "
<< "категория: " << std::get<1>(student0) << ", "
<< "имя: " << std::get<2>(student0) << '\n';
const auto student1 = get_student(1);
std::cout << "ИД: 1, "
<< "Средний балл: " << std::get<double>(student1) << ", "
<< "категория: " << std::get<char>(student1) << ", "
<< "имя: " << std::get<std::string>(student1) << '\n';
double gpa2;
char grade2;
std::string name2;
std::tie(gpa2, grade2, name2) = get_student(2);
std::cout << "ИД: 2, "
<< "Средний балл: " << gpa2 << ", "
<< "категория: " << grade2 << ", "
<< "имя: " << name2 << '\n';
// структурная привязка C++17
const auto [ gpa3, grade3, name3 ] = get_student(3);
std::cout << "ИД: 3, "
<< "Средний балл: " << gpa3 << ", "
<< "категория: " << grade3 << ", "
<< "имя: " << name3 << '\n';
}
Вывод:
ИД: 0, Средний балл: 3.8, категория: A, имя: Лиза Симпсон
ИД: 1, Средний балл: 2.9, категория: C, имя: Милхаус Ван Хаутен
ИД: 2, Средний балл: 1.7, категория: D, имя: Ральф Виггам
ИД: 3, Средний балл: 0.6, категория: F, имя: Барт Симпсон
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| 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]
Смотрите также
| реализует двойной кортеж, т.е. пару значений (шаблон класса) |