我希望使用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
?
注意:我知道之类的,但这个问题更多的是一个“这是否可能?”而不是“这是否是最好的方法?”。
任何帮助都将不胜感激。
谢谢。
[0 .. 127]
的范围吗?而且char
的符号是由实现定义的。你目前的方法非常危险。哦,最后但并非最不重要的是,C++标准根本不要求使用ASCII编码。它也可以是EBCDIC。 - Xeo((c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A))
来自IsAlphabet
-- 这假设了 ASCII 中存在的十进制排序。符号很重要,因为 OP 传递字面值> 127
,这可能映射到负的char
。 - Xeo0x41
根本没有映射到任何符号,并且字母在代码页中的位置很奇怪。请参见这里。 - Xeo