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,