Składnia
#include <utility>
namespace std
{
template < typename T, T...Ints >
class integer_sequence;
}
Parametry szablonu
Typy składowe
Metody klasy
Opis szczegółowy
Szablon klasy ze zmienną liczbą argumentów przyjmujący sekwencję liczb całkowitych, na których można operować w trakcie kompilacji.
Dodatkowe informacje
Do sekwencji liczb istnieją pomocne szablony aliasów:
namespace std
{
template < std::size_t...Ints >
using index_sequence = std::integer_sequence < std::size_t, Ints...>;
template < typename T, T N >
using make_integer_sequence = std::integer_sequence < T, >;
template < std::size_t N >
using make_index_sequence = make_integer_sequence < std::size_t, N >;
template < class...T >
using index_sequence_for = std::make_index_sequence < sizeof...( T ) >;
}
Dla N poniżej 0 program jest narażony na błędy (ang. "ill-formed").
Rzucane wyjątki
Tworzenie sekwencji liczb odbywa się na etapie kompilacji, dlatego wyjątki nie są rzucane.
Wymagania
Kompilator zgodny z C++14, lub posiadający implementację tego szablonu struktury.
Implementacja
namespace std
{
template < typename T, T...elements >
struct sequence
{
typedef T value_type;
static constexpr std::size_t size() noexcept
{
return sizeof...( elements );
}
};
}
Przykład
#include <iostream>
#include <utility>
using namespace std;
template < typename T, T...sequence >
constexpr std::ostream & operator <<( std::ostream & os, const std::integer_sequence < T, sequence...>& )
{
constexpr T values[] = { sequence...};
for( auto a: values )
os << a << ", ";
return os;
}
template < typename T, T...sequence >
void printSequence( const std::integer_sequence < T, sequence...>& );
template < typename T >
void printSequence( const std::integer_sequence < T >& )
{ }
template < typename T, T t, T...sequence >
void printSequence( const std::integer_sequence < T, t, sequence...>& )
{
cout << t << ", ";
printSequence( std::integer_sequence < T, sequence...>() );
}
template < size_t N, typename T, T...sequence >
T get( const std::integer_sequence < T, sequence...>& );
template < size_t N, typename T, T t, T...sequence >
T get( const std::integer_sequence < T, t, sequence...>& )
{
return N ? get < N - 1 >( std::integer_sequence < T, sequence...>() )
: t;
}
int main()
{
auto sequence1 = integer_sequence < int, 2, 4, 6, 8, 10, 12 >();
auto sequence2 = index_sequence < 1, 3, 5, 7, 9 >();
auto sequence3 = make_integer_sequence < unsigned, 4 >();
auto sequence4 = make_index_sequence < 3 >();
cout << sequence1 << endl;
cout << sequence2 << endl;
cout << sequence3 << endl;
cout << sequence4 << endl;
printSequence( sequence1 );
cout << endl;
printSequence( integer_sequence < size_t > { } );
cout << "Element from sequence {" << sequence1 << "} with index 2: " << get < 2 >( sequence1 ) << endl;
}
Standardowe wyjście programu:
2, 4, 6, 8, 10, 12,
1, 3, 5, 7, 9,
0, 1, 2, 3,
0, 1, 2,
2, 4, 6, 8, 10, 12,
Element from sequence {2, 4, 6, 8, 10, 12, } with index 2: 6
Przykład na quicksort w trakcie kompilacji przy użyciu integer_sequence.
Zagadnienia powiązane
tuple | Umożliwia tworzenie zbiorów danych o ustalonej liczbie elementów różnych typów. (szablon klasy) |
---|
Linki zewnętrzne