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

cpp/utility/integer sequence — различия между версиями

Материал из cppreference.com
< cpp‎ | utility
(Example)
м
 
(не показаны 4 промежуточные версии 1 участника)
Строка 11: Строка 11:
 
{{par begin}}
 
{{par begin}}
 
{{par | T | целочисленный тип, используемый для элементов последовательности}}
 
{{par | T | целочисленный тип, используемый для элементов последовательности}}
{{par | ...Ints | пакет параметров не тип, представляющий последовательность}}
+
{{par | ...Ints | пакет параметров не , представляющий последовательность}}
 
{{par end}}
 
{{par end}}
  
Строка 33: Строка 33:
  
 
===Параметры===
 
===Параметры===
(none)
+
()
  
 
===Возвращаемое значение===
 
===Возвращаемое значение===
Строка 42: Строка 42:
 
===Вспомогательные шаблоны===
 
===Вспомогательные шаблоны===
  
Псевдоним вспомогательного шаблона {{ttb|std::index_sequence}} определён для общего случая, когда {{tt|T}} равен {{lc|std::size_t}}:
+
шаблона {{ttb|std::index_sequence}} определён для общего случая, когда {{tt|T}} равен {{lc|std::size_t}}:
  
 
{{ddcl | 1=
 
{{ddcl | 1=
Строка 49: Строка 49:
 
}}
 
}}
  
Псевдонимы вспомогательных шаблонов {{ttb|std::make_integer_sequence}} и {{ttb|std::make_index_sequence}} определены для упрощения создания типов {{tt|std::integer_sequence}} и {{tt|std::index_sequence}} соответственно, с {{tt|Ints}} равным 0, 1, 2, ..., {{tt|N-1}}:
+
шаблонов {{ttb|std::make_integer_sequence}} и {{ttb|std::make_index_sequence}} определены для упрощения создания типов {{tt|std::integer_sequence}} и {{tt|std::index_sequence}} соответственно, с {{tt|Ints}} равным 0, 1, 2, ..., {{tt|N-1}}:
  
 
{{dcl begin}}
 
{{dcl begin}}
Строка 64: Строка 64:
 
Программа некорректна, если {{tt|N}} отрицательное. Если {{tt|N}} равно нулю, указанный тип это {{tt|integer_sequence<T>}}.
 
Программа некорректна, если {{tt|N}} отрицательное. Если {{tt|N}} равно нулю, указанный тип это {{tt|integer_sequence<T>}}.
  
Псевдоним вспомогательного шаблона {{ttb|std::index_sequence_for}} определён для преобразования любого пакета параметров типа в индексную последовательность той же длины:
+
шаблона {{ttb|std::index_sequence_for}} определён для преобразования любого пакета параметров типа в индексную последовательность той же длины:
  
 
{{dcl begin}}
 
{{dcl begin}}
Строка 74: Строка 74:
  
 
===Примечание===
 
===Примечание===
{{feature test macro|__cpp_lib_integer_sequence}}
+
{{feature test macro|__cpp_lib_integer_sequence}}
  
 
===Пример===
 
===Пример===
Строка 149: Строка 149:
 
}}
 
}}
  
===See also===
+
======
 
{{dsc begin}}
 
{{dsc begin}}
 
{{dsc inc | cpp/container/array/dsc to_array}}
 
{{dsc inc | cpp/container/array/dsc to_array}}

Текущая версия на 21:05, 5 сентября 2023

 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
integer_sequence
(C++14)
 
Определено в заголовочном файле <utility>
template< class T, T... Ints >
class integer_sequence;
(начиная с C++14)

Шаблон класса std::integer_sequence представляет последовательность целых чисел времени компиляции. При использовании в качестве аргумента шаблона функции пакет параметров Ints может быть выведен и использован в расширении пакета.

Содержание

[править] Параметры шаблона

T целочисленный тип, используемый для элементов последовательности
...Ints пакет параметров не типов, представляющий последовательность

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

Тип элемента Определение
value_type T

[править] Функции-элементы

size
[static]
возвращает количество элементов в Ints
(public static функция-элемент)

std::integer_sequence::size

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 из встроенного массива
(шаблон функции) [править]