Rellenar una matriz usando Constexpr en tiempo de compilación

Me gustaría rellenar una serie de enumeración utilizando constexpr. El contenido de la matriz sigue un cierto patrón.

Tengo un enum que separa el conjunto de caracteres ASCII en cuatro categorías.

enum Type {
    Alphabet,
    Number,
    Symbol,
    Other,
};

constexpr Type table[128] = /* blah blah */;

Me gustaría tener una matriz de 128Type. Pueden estar en una estructura. El índice de la matriz corresponderá a los caracteres ASCII y el valor será elType de cada personaje.

Entonces puedo consultar esta matriz para averiguar a qué categoría pertenece un carácter ASCII. Algo como

char c = RandomFunction();
if (table[c] == Alphabet) 
    DoSomething();

Me gustaría saber si esto es posible sin algunos hacks macro largos.

Actualmente, inicializo la tabla haciendo lo siguiente.

constexpr bool IsAlphabet (char c) {
    return ((c >= 0x41 && c <= 0x5A) ||
            (c >= 0x61 && c <= 0x7A));
}

constexpr bool IsNumber (char c) { /* blah blah */ }

constexpr bool IsSymbol (char c) { /* blah blah */ }

constexpr Type whichCategory (char c) { /* blah blah */ }

constexpr Type table[128] = { INITIALIZE };

dóndeINITIALIZE Es el punto de entrada de algunos hacks macro muy largos. Algo como

#define INITIALIZE INIT(0)
#define INIT(N) INIT_##N
#define INIT_0 whichCategory(0), INIT_1
#define INIT_1 whichCategory(1), INIT_2
//...
#define INIT_127 whichCategory(127)

Me gustaría una forma de rellenar esta matriz o una estructura que contenga la matriz sin la necesidad de este macro hack ...

Tal vez algo como

struct Table {
    Type _[128];
};

constexpr Table table = MagicFunction();

Entonces, la pregunta es cómo escribir esto.MagicFunction?

Nota: Soy consciente de cctype y me gusta, esta pregunta es más de unIs this possible? más bien queIs this the best way to do it?.

Cualquier ayuda sería apreciada.

Gracias,

Respuestas a la pregunta(4)

Su respuesta a la pregunta