Czytałem this pytanie na SO.Inicjalizacja zestawu danych Czas kompilacji - ciąg Constexpr
Samo pytanie nie jest tak interesujące, ale zastanawiałem się, czy istnieje i jak zaimplementować rozwiązanie w czasie kompilacji.
odniesieniu do pierwszej sekwencji:
Wszystkie numery z wyjątkiem tych, które można podzielić przez 3.
Sekwencja powinno być coś takiego:
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, ...]
przez indukcję , Znalazłem wzór matematyczny dla tej sekwencji:
f(0) = 0;
f(x > 0) = floor[(3x - 1)/2];
Więc zostały wdrożone w C++ constexpr
funkcję, która generuje i-th numer w kolejności:
#include <type_traits>
template <typename T = std::size_t>
constexpr T generate_ith_number(const std::size_t index) {
static_assert(std::is_integral<T>::value, "T must to be an integral type");
if (index == 0) return 0;
return (3 * index - 1)/2;
}
Teraz chciałbym wygenerować "kompilacji czasu tablicy/sekwencji", który przechowuje pierwsze N-ty numer sekwencji.
Struktura powinno być coś jak:
template <typename T, T... values>
struct sequence {};
template <typename T, std::size_t SIZE>
struct generate_sequence {}; // TODO: implement
pytania (więcej niż jedna, ale związane między nimi):
1) Jak wdrożyć tego rodzaju integer_sequence
?
2) Czy jest możliwe zbudowanie std::array
z tego integer_sequence
podczas kompilacji?
Z dedukcjami konstruktora C++ 17, 'std :: array {Is ...};' może być uproszczone do 'std :: array {Is ... }; '. –
metal