constexpr を使用して列挙型の配列を設定したいと思います。配列の内容は特定のパターンに従います。
ASCII 文字セットを 4 つのカテゴリに分ける列挙型があります。
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 を認識しています。この質問Is this possible?
はIs this the best way to do it?
.
どんな助けでも大歓迎です。
ありがとう、