Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir tamsayı dizisini temsil eder. Bir işleve bağımsız değişken olarak geçirilen std::tuple<T...> gibi variadic türlerdeki parametre paketlerini açmak ve genişletmek için kullanılabilir.
Sözdizimi
template <class T, T... Vals>
struct integer_sequence
Parametreler
T
Değerlerin türü; tam sayı türünde olmalıdır: bool, char, char16_t, char32_t, wchar_t veya imzalı veya imzasız tamsayı türleri.
Vals
T tamser türündeki bir değer dizisini temsil eden tür olmayan parametre paketi.
Üyeler
| Veri Akışı Adı | Açıklama |
|---|---|
static size_t size() noexcept |
Dizideki öğelerin sayısı. |
typedef T value_type |
Dizideki her öğenin türü. Tam sayı türünde olmalıdır. |
Açıklamalar
Doğrudan bir işleve geçirilen parametre paketi, özel kitaplık yardımcıları olmadan paketten çıkarılabilir. Parametre paketi bir işleve geçirilen bir türün parçası olduğunda ve öğelere erişmek için dizinlere ihtiyacınız varsa, paketi açmanın en kolay yolu ve ilgili tür diğer adlarını make_integer_sequence, , index_sequencemake_index_sequenceve index_sequence_forkullanmaktırinteger_sequence.
Örnek
Aşağıdaki örnek, özgün teklif N3658'i temel alır. bir öğesinden oluşturmak için 'nin nasıl kullanılacağını integer_sequence ve tanımlama grubu üyelerine ulaşmak için nasıl integer_sequence kullanılacağını gösterir.std::tuple std::array<T,N>
işlevindea2t, index_sequence integral türüne göre size_t bir diğer adıdırinteger_sequence. make_index_sequence , derleme zamanında çağıran tarafından geçirilen diziyle aynı sayıda öğe içeren sıfır tabanlı index_sequence bir diğer addır. a2tindex_sequence değerine göre değerini a2t_geçirir; burada ifade a[I]... paketini Iaçar ve sonra bunları bağımsız değişken olarak kullanan öğeler beslenirmake_tuple. Örneğin, dizi üç öğe içeriyorsa, make_tuple make_tuple(a[0], a[1], a[2]) olarak adlandırılır. Dizi öğelerinin kendileri elbette herhangi bir tür olabilir.
apply işlevi bir std::tuple kabul eder ve yardımcı sınıfını tuple_size kullanarak bir integer_sequence oluşturur. tuple_size başvuru türleriyle çalışmadığından std::d ecay_t gerekli olduğunu unutmayın. İşlev, apply_ tanımlama grubu üyelerini açar ve bunları bir işlev çağrısına ayrı bağımsız değişkenler olarak iletir. Bu örnekte işlev, değerleri yazdıran basit bir lambda ifadesidir.
#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;
}
Parametre paketi oluşturmak index_sequence için, sizeof... için<make_index_sequence diğer ad olan T...> kullanınindex_sequence_for<. (T)>
Gereksinimler
Üst bilgi: <type_traits>
Ad Alanı: std