integer_sequence — klasa
Reprezentuje sekwencję całkowitą. Może służyć do deduce i rozszerzania pakietów parametrów w typach wariadycznych, takich jak std::tuple<T...> przekazywanych jako argumenty do funkcji.
Składnia
template <class T, T... Vals>
struct integer_sequence
Parametry
T
Typ wartości; musi być typem całkowitoliczbowym: bool, char, char16_t, char32_t, wchar_t lub typy ze znakiem lub bez znaku liczby całkowitej.
Vals
Pakiet parametrów innych niż typ, który reprezentuje sekwencję wartości typu całkowitego T.
Członkowie
Nazwa/nazwisko | opis |
---|---|
static size_t size() noexcept |
Liczba elementów w sekwencji. |
typedef T value_type |
Typ każdego elementu w sekwencji. Musi być typem całkowitym. |
Uwagi
Pakiet parametrów przekazywany bezpośrednio do funkcji można rozpakować bez żadnych specjalnych pomocników biblioteki. Gdy pakiet parametrów jest częścią typu, który jest przekazywany do funkcji i potrzebujesz indeksów, aby uzyskać dostęp do elementów, najprostszym sposobem rozpakowania go jest użycie integer_sequence
i jego powiązanych aliasów make_integer_sequence
typów , , index_sequence
make_index_sequence
i index_sequence_for
.
Przykład
Poniższy przykład jest oparty na pierwotnej propozycji N3658. Pokazano w nim, jak za pomocą elementu utworzyć integer_sequence
element std::tuple
na podstawie std::array<T,N>
elementu i jak używać elementu integer_sequence
, aby uzyskać dostęp do elementów członkowskich krotki.
a2t
W funkcji element jest index_sequence
aliasem integer_sequence
opartym na typie całkowitymsize_t
. make_index_sequence
jest aliasem, który w czasie kompilacji tworzy zero oparte index_sequence
na tej samej liczbie elementów co tablica przekazywana przez obiekt wywołujący. a2t
przekazuje wartość index_sequence
by do a2t_
, gdzie wyrażenie a[I]...
rozpakuje I
element , a następnie elementy są przekazywane, co make_tuple
zużywa je jako poszczególne argumenty. Jeśli na przykład sekwencja zawiera trzy elementy, make_tuple
jest wywoływana jako make_tuple(a[0], a[1], a[2]). Same elementy tablicy mogą być oczywiście dowolnym typem.
Funkcja apply akceptuje krotkę std::tuple i tworzy obiekt integer_sequence
przy użyciu klasy pomocniczej tuple_size
. Należy pamiętać, że element std::d ecay_t jest niezbędny, ponieważ tuple_size nie działa z typami referencyjnymi. Funkcja apply_
rozpakuje elementy członkowskie krotki i przekazuje je jako oddzielne argumenty do wywołania funkcji. W tym przykładzie funkcja jest prostym wyrażeniem lambda, które wyświetla wartości.
#include <stddef.h>
#include <iostream>
#include <tuple>
#include <utility>
#include <array>
#include <string>
using namespace std;
// Create a tuple from the array and the index_sequence
template<typename Array, size_t... I>
auto a2t_(const Array& a, index_sequence<I...>)
{
return make_tuple(a[I]...);
}
// Create an index sequence for the array, and pass it to the
// implementation function a2t_
template<typename T, size_t N>
auto a2t(const array<T, N>& a)
{
return a2t_(a, make_index_sequence<N>());
}
// Call function F with the tuple members as separate arguments.
template<typename F, typename Tuple = tuple<T...>, size_t... I>
decltype(auto) apply_(F&& f, Tuple&& args, index_sequence<I...>)
{
return forward<F>(f)(get<I>(forward<Tuple>(args))...);
}
// Create an index_sequence for the tuple, and pass it with the
// function object and the tuple to the implementation function apply_
template<typename F, typename Tuple = tuple<T...>>
decltype(auto) apply(F&& f, Tuple&& args)
{
using Indices = make_index_sequence<tuple_size<decay_t<Tuple>>::value >;
return apply_(forward<F>(f), forward<Tuple>(args), Indices());
}
int main()
{
const array<string, 3> arr { "Hello", "from", "C++14" };
//Create a tuple given a array
auto tup = a2t(arr);
// Extract the tuple elements
apply([](const string& a, const string& b, const string& c) {cout << a << " " << b << " " << c << endl; }, tup);
char c;
cin >> c;
}
Aby utworzyć element index_sequence
dla pakietu parametrów, użyj<index_sequence_for
języka T...> który jest aliasem dla make_index_sequence
<parametru sizeof... (T)>
Wymagania
Nagłówek: <type_traits>
Przestrzeń nazw: std
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla