Пространства имён
Варианты
Действия

std::tuple_element<std::tuple>

Материал из cppreference.com
< cpp‎ | utility‎ | tuple
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции об��ена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
Определено в заголовочном файле <tuple>
template< std::size_t I, class... Types >
struct tuple_element< I, std::tuple<Types...> >;
(начиная с C++11)

Предоставляет индексированный доступ к типам элементов tuple во время компиляции.

Содержание

[править] Типы элементы

Тип элемент Определение
type тип I-го элемента tuple, где I находится в диапазоне [0, sizeof...(Types))

[править] Возможная реализация

template< std::size_t I, class T >
struct tuple_element;
 
// рекурсивный вариант
template< std::size_t I, class Head, class... Tail >
struct tuple_element<I, std::tuple<Head, Tail...>>
    : std::tuple_element<I-1, std::tuple<Tail...>> { };
 
// базовый вариант
template< class Head, class... Tail >
struct tuple_element<0, std::tuple<Head, Tail...>> {
   using type = Head;
};

[править] Пример

#include <cstddef>
#include <iostream>
#include <string>
#include <tuple>
#include <typeinfo>
#include <type_traits>
#include <utility>
 
namespace details
{
    template<class TupleLike, std::size_t I>
    void printTypeAtIndex()
    {
        std::cout << "  Тип по индексу " << I << " равен: ";
        using SelectedType = std::tuple_element_t<I, TupleLike>;
        std::cout << typeid(SelectedType).name() << '\n';
    }
}
 
template<typename TupleLike, std::size_t I = 0>
void printTypes()
{
    if constexpr (I == 0)
        std::cout << typeid(TupleLike).name() << '\n';
 
    if constexpr (I < std::tuple_size_v<TupleLike>)
    {
        details::printTypeAtIndex<TupleLike, I>();
        printTypes<TupleLike, I + 1>();
    }
}
 
struct MyStruct {};
 
using MyTuple = std::tuple<int, long, char, bool, std::string, MyStruct>;
 
using MyPair = std::pair<char, bool>;
 
static_assert
(
    std::is_same_v<std::tuple_element_t<0, MyPair>, char> &&
    std::is_same_v<std::tuple_element_t<1, MyPair>, bool>
);
 
int main()
{
    printTypes<MyTuple>();
    printTypes<MyPair>();
}

Возможный вывод:

St5tupleIJilcbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE8MyStructEE
  Тип по индексу 0 равен: i
  Тип по индексу 1 равен: l
  Тип по индексу 2 равен: c
  Тип по индексу 3 равен: b
  Тип по индексу 4 равен: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
  Тип по индексу 5 равен: 8MyStruct
St4pairIcbE
  Тип по индексу 0 равен: c
  Тип по индексу 1 равен: b

[править] Смотрите также

Структурные привязки (C++17) привязывает указанные имена к подобъектам или элементам кортежа инициализатора[править]
получает типы элементов tuple подобного типа
(шаблон класса) [править]