Je lisais this question sur SO.Temps de compilation d'initialisation de matrice - Séquence Constexpr
La question elle-même n'est pas très intéressante, mais je me demandais si elle existe et comment implémenter une solution de compilation.
Regard à la première séquence:
Tous les numéros, sauf ceux qui peuvent être divisés par 3.
La séquence devrait être quelque chose comme:
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, ...]
par induction , J'ai trouvé la formule mathématique pour cette séquence:
f(0) = 0;
f(x > 0) = floor[(3x - 1)/2];
J'ai donc mis en œuvre une fonction constexpr
C++ qui génère le i-ème numéro dans la séquence:
#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;
}
Maintenant, j'aimerais générer un "tableau de compilation/séquence" qui stocke les premiers numéros N de la séquence.
La structure doit être quelque chose comme:
template <typename T, T... values>
struct sequence {};
template <typename T, std::size_t SIZE>
struct generate_sequence {}; // TODO: implement
Questions (plus d'un, mais liés entre eux):
1) Comment mettre en œuvre ce genre de integer_sequence
?
2) Est-il possible de construire un std::array
à partir de ce integer_sequence
au moment de la compilation?
Avec les déductions du constructeur C++ 17, 'std :: array {Is ...};' pourrait être simplifié en 'std :: array {Is ... }; '. –
metal