我想使用 constexpr 填充枚举数组。数组的内容遵循一定的模式。
我有一个枚举,将 ASCII 字符集分为四类。
enum Type {
Alphabet,
Number,
Symbol,
Other,
};
constexpr Type table[128] = /* blah blah */;
我想要一个 128 的数组Type
。它们可以在一个结构中。数组的索引将对应于 ASCII 字符,值将是Type
每个字符的值。
所以我可以查询这个数组来找出一个 ASCII 字符属于哪个类别。就像是
char c = RandomFunction();
if (table[c] == Alphabet)
DoSomething();
我想知道如果没有一些冗长的宏黑客这是否可能。
目前,我通过执行以下操作来初始化表。
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 };
INITIALIZE
一些非常冗长的宏黑客的入口点在哪里。就像是
#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)
我想要一种方法来填充这个数组或包含数组的结构,而不需要这个宏黑客......
也许像
struct Table {
Type _[128];
};
constexpr Table table = MagicFunction();
所以,问题是如何写这个MagicFunction
?
注意:我知道 cctype 和 likes,这个问题更多的是 aIs this possible?
而不是Is this the best way to do it?
.
任何帮助,将不胜感激。
谢谢,