Ich las this Frage zu SO.Array-Initialisierungs-Kompilierzeit - Contexpr-Sequenz
Die Frage selbst ist nicht so interessant, aber ich frage mich, ob es existiert und wie man eine Kompilierzeitlösung implementiert.
Hinblick auf die erste Sequenz:
Alle Zahlen mit Ausnahme derjenigen, die von 3.
Die Reihenfolge sollte so etwas sein, unterteilt werden können:
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, ...]
Durch Induktion Ich habe die mathematische Formel für diese Sequenz gefunden:
f(0) = 0;
f(x > 0) = floor[(3x - 1)/2];
So habe ich eine C++ constexpr
Funktion implementiert, die die i-ten Zahl in der Folge erzeugt:
#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;
}
Jetzt möchte ich erzeugen ein "Kompilierung-Array/Sequenz" speichert die ersten N-ten Nummern der Sequenz.
sollte die Struktur so etwas wie:
template <typename T, T... values>
struct sequence {};
template <typename T, std::size_t SIZE>
struct generate_sequence {}; // TODO: implement
Fragen (mehr als eine, aber unter ihnen verwandt):
1) Wie diese Art von integer_sequence
zu implementieren?
2) Ist es möglich, einen von dieser integer_sequence
zur Kompilierzeit zu erstellen?
Mit C++ 17 Konstruktorableitungen, 'std :: array {Is ...};' könnte vereinfacht werden zu 'std :: array {Is ... }; '. –
metal