Preencher um array usando o Constexpr no tempo de compilação

Eu gostaria de preencher uma matriz de enum usando constexpr. O conteúdo da matriz segue um certo padrão.

Eu tenho um enum que separa o conjunto de caracteres ASCII em quatro categorias.

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

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

Eu gostaria de ter uma matriz de 128Type. Eles podem estar em uma estrutura. O índice da matriz será correspondente aos caracteres ASCII e o valor será oType de cada personagem.

Então, posso consultar essa matriz para descobrir a qual categoria um caractere ASCII pertence. Algo como

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

Eu gostaria de saber se isso é possível sem alguns macros hacks longos.

Atualmente, inicializo a tabela fazendo o seguinte.

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 };

OndeINITIALIZE é o ponto de entrada de alguns hacks de macro muito longos. 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)

Eu gostaria de uma maneira de preencher essa matriz ou uma estrutura que contém a matriz sem a necessidade de esta macro hack ...

Talvez algo como

struct Table {
    Type _[128];
};

constexpr Table table = MagicFunction();

Então, a questão é como escrever issoMagicFunction?

Nota: Estou ciente de cctype e gosta, esta questão é mais de umIs this possible? ao invés deIs this the best way to do it?.

Qualquer ajuda seria apreciada.

Obrigado,

questionAnswers(4)

yourAnswerToTheQuestion