std:: tuple
|
Определено в заголовочном файле
<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 в отдельные объекты
(шаблон функции) |
|
(C++11)
|
создает
tuple
из
forwarding references
(шаблон функции) |
|
(C++11)
|
создает
tuple
путем конкатенации любого количества кортежей
(шаблон функции) |
|
(C++11)
|
обращается к указанному элементу tuple
(шаблон функции) |
|
(удален в C++20)
(удален в C++20)
(удален в C++20)
(удален в C++20)
(удален в C++20)
(C++20)
|
лексикографически сравнивает значения в tuple
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
Вспомогательные концепции
|
(C++23)
|
указывает, что тип реализует
tuple protocol
( std::get , std::tuple_element , std::tuple_size ) ( exposition-only concept* ) |
Вспомогательные классы
|
(C++11)
|
получает размер
|
|
(C++11)
|
получает тип указанного элемента
(специализация шаблона класса) |
|
(C++11)
|
специализирует
std::uses_allocator
type trait
(специализация шаблона класса) |
определяет общий ссылочный тип
tuple
и
tuple-like
типа
(специализация шаблона класса) |
|
|
(C++23)
|
определяет общий тип
tuple
и
tuple-like
типа
(специализация шаблона класса) |
|
(C++23)
|
поддержка форматирования для
tuple
(специализация шаблона класса) |
|
(C++11)
|
заполнитель для пропуска элемента при распаковке
tuple
с использованием
tie
(константа) |
Специализации вспомогательных функций
|
template
<
class
...
Ts
>
constexpr
bool
enable_nonlocking_formatter_optimization
<
std
::
tuple
<
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]
Смотрите также
|
реализует бинарный кортеж, т.е. пару значений
(шаблон класса) |