我想使用constexpr填充枚舉數組。 數組的內容遵循一定的模式。在編譯時使用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和喜歡,這個問題更是一個Is this possible?
而不是Is this the best way to do it?
。
任何幫助,將不勝感激。
感謝,
你知道ASCII只能範圍'[0 .. 127]'?那個'char'的簽名是實現定義的嗎?你目前的做法非常危險。哦,最後但並非最不重要的是,C++標準完全不需要ASCII編碼。它也可能是EBCDIC。 – Xeo
好消息是,因爲數組可以通過擴展包進行初始化,所以您要求的確實可行。您只需調用該函數很多次:p –
最有可能不可能,因爲C++不需要字符的ASCII表示。另外,從最嚴格的意義上講,ASCII字符集只包含128個字符。 –