Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Elementy członkowskie
| 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_sequencetypów , , index_sequencemake_index_sequencei 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 Ielement , 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