Preprocesor dynamicznie tworzący x zmiennych typu constexpr

0

Hej,
najpierw przykład jak to jest tworzone manualnie:

namespace Values
{
   constexpr auto NUM_VALUES = 5;
   constexpr auto VALUE_1 = 100;
   constexpr auto VALUE_2 = 200;
   constexpr auto VALUE_3 = 300;
   constexpr auto VALUE_4 = 400;
   constexpr auto VALUE_5 = 500;
}

Liczba zmiennych VALUE_X wynosi dokładnie NUM_VALUES.
Dałoby to się zautomatyzować? np. coś takiego (co oczywiście nie działa):

namespace Values
{
   constexpr auto NUM_VALUES = 5;
   for constexpr(auto i = 0; i < NUM_VALUES; ++i)
   {
      constexpr auto VALUE_i = i * 100;
   }
}

Myślałem nad preprocesorem w stylu C ale on nam nie zdefiniuje zmiennych - nie będzie podpowiedzi jakie te zmienne istnieją, ile ich jest, tylko wartość jaka ta zmienna mogłaby zawierać.
W tym przypadku VALUE_6 nie istnieje i nie powinna istnieć.

4

Jeśli wszystkie wartości są generowane na podstawie tego samego wzoru, może sprawdziłaby się u Ciebie funkcja constexpr? (przyjmująca to Twoje x lub i i zwracająca wygenerowaną wartość).

Z innych, interesujących rozwiązań:

3

Zawsze, jak w kodzie pojawiają się symbole różniące się tylko kolejnym indeksem w nazwie, to jest sygnał, że potrzebna jest tablica, a nie NUM_VALUES zmiennych.
Nie jest ważne, czy to dotyczy zmiennych lokalnych, globalnych, czy stałych wyrażeń.

Samo pytanie cierpi na problem xy, więc nie potrafię podać rozsądnego rozmawiania.
Tablica się nasuwa, ale biorąc pod uwagę, że wartości są wielokrotnością 100 to wygląda mi to na overenginering

2

Bez użycia tablicy się nie obejdzie, ale możesz do tego celu użyć integer_sequence ( C++17 )

#include <iostream>
#include <array>
#include <utility>

// C++17

using namespace std;

constexpr auto NUM_VALUES = 5;
template< int... i > constexpr auto init( integer_sequence<int,i...> ) { return array{(100*(i+1))...}; };

constexpr auto Values = init( make_integer_sequence<int,NUM_VALUES>{} );

int main()
{
    for( const auto& value : Values ) cout << value << endl;   
    return 0;
}

https://wandbox.org/permlink/Lk2q1vOqWYvVeGHH

1 użytkowników online, w tym zalogowanych: 0, gości: 1