std::integer_sequence
| Определено в заголовочном файле <utility>
|
||
template< class T, T... Ints > class integer_sequence; |
(начиная с C++14) | |
Шаблон класса std::integer_sequence представляет последовательность целых чисел времени компиляции. При использовании в качестве аргумента шаблона функции пакет параметров Ints может быть выведен и использован в расширении пакета.
Параметры шаблона
| T | — | целочисленный тип, используемый для элементов последовательности |
| ...Ints | — | пакет параметров не типов, представляющий последовательность |
Типы элементов
| Тип элемента | Определение |
value_type
|
T
|
Функции-элементы
[static] |
возвращает количество элементов в Ints (public static функция-элемент) |
std::integer_sequence::size
<tbody> </tbody> static constexpr std::size_t size() noexcept; |
||
Возвращает количество элементов в Ints. Эквивалентно sizeof...(Ints)
Параметры
(нет)
Возвращаемое значение
Количество элементов в Ints.
Вспомогательные шаблоны
Вспомогательный псевдоним шаблона std::index_sequence определён для общего случая, когда T равен std::size_t:
template<std::size_t... Ints> using index_sequence = std::integer_sequence<std::size_t, Ints...>; |
||
Вспомогательные псевдонимы шаблонов std::make_integer_sequence и std::make_index_sequence определены для упрощения создания типов std::integer_sequence и std::index_sequence соответственно, с Ints равным 0, 1, 2, ..., N-1:
template<class T, T N> using make_integer_sequence = std::integer_sequence<T, /* последовательность 0, 1, 2, ..., N-1 */ >; |
||
template<std::size_t N> using make_index_sequence = std::make_integer_sequence<std::size_t, N>; |
||
Программа некорректна, если N отрицательное. Если N равно нулю, указанный тип это integer_sequence<T>.
Вспомогательный псевдоним шаблона std::index_sequence_for определён для преобразования любого пакета параметров типа в индексную последовательность той же длины:
template<class... T> using index_sequence_for = std::make_index_sequence<sizeof...(T)>; |
||
Примечание
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_integer_sequence |
201304L |
(C++14) | Целочисленные последовательности времени компиляции |
Пример
Примечание: другой пример смотрите в разделе Возможная реализация в std::apply.
#include <tuple>
#include <iostream>
#include <array>
#include <utility>
// средство отладки
template<typename T, T... ints>
void print_sequence(std::integer_sequence<T, ints...> int_seq)
{
std::cout << "Последовательность размера " << int_seq.size() << ": ";
((std::cout << ints << ' '), ...);
std::cout << '\n';
}
// преобразовывает массив в кортеж
template<typename Array, std::size_t... I>
auto a2t_impl(const Array& a, std::index_sequence<I...>)
{
return std::make_tuple(a[I]...);
}
template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>>
auto a2t(const std::array<T, N>& a)
{
return a2t_impl(a, Indices{});
}
// красивая печать кортежа
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch,Tr>& os,
const Tuple& t,
std::index_sequence<Is...>)
{
((os << (Is == 0? "" : ", ") << std::get<Is>(t)), ...);
}
template<class Ch, class Tr, class... Args>
auto& operator<<(std::basic_ostream<Ch, Tr>& os,
const std::tuple<Args...>& t)
{
os << "(";
print_tuple_impl(os, t, std::index_sequence_for<Args...>{});
return os << ")";
}
int main()
{
print_sequence(std::integer_sequence<unsigned, 9, 2, 5, 1, 9, 1, 6>{});
print_sequence(std::make_integer_sequence<int, 20>{});
print_sequence(std::make_index_sequence<10>{});
print_sequence(std::index_sequence_for<float, std::iostream, char>{});
std::array<int, 4> array = {1, 2, 3, 4};
// преобразование массива в кортеж
auto tuple = a2t(array);
static_assert(std::is_same_v<decltype(tuple),
std::tuple<int, int, int, int>>, "");
// печать его в cout
std::cout << "Кортеж: " << tuple << '\n';
}
Вывод:
Последовательность размера 7: 9 2 5 1 9 1 6
Последовательность размера 20: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Последовательность размера 10: 0 1 2 3 4 5 6 7 8 9
Последовательность размера 3: 0 1 2
Кортеж: (1, 2, 3, 4)
Смотрите также
(C++20) |
создаёт объект std::array из встроенного массива (шаблон функции) |