Я хотел бы заполнить массив enum, используя 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)
Мне нужен способ заполнить этот массив или структуру, содержащую массив, без необходимости этого макроса hack...
Может быть что-то вроде
struct Table {
Type _[128];
};
constexpr Table table = MagicFunction();
Итак, вопрос в том, как написать это MagicFunction
?
Примечание: Я знаю cctype и любит, этот вопрос скорее Is this possible?
, чем Is this the best way to do it?
.
Любая помощь будет оценена.
Спасибо,