std::tuple_element<std::tuple>
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <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) | привязывает указанные имена к подобъектам или элементам кортежа инициализатора |
(C++11) |
получает типы элементов tuple подобного типа (шаблон класса) |