Пара enum-string-int во время компиляции - PullRequest
0 голосов
/ 17 марта 2019

Есть ли способ создать enum во время компиляции с индексами для массива строк?

Что-то вроде:

// Programmer types this in:
SOME_MACRO(PEAR,"a pear");
SOME_MACRO(APPLE,"an apple");
SOME_MACRO(ORANGE,"an orange");
// ...

// Result after pre-processing and "compiling"

// String array
const char* myarray[] = { "a pear", "an apple", "an orange", /* ... */ };

// Enum
enum myenum
{
    PEAR = 1,
    APPLE = 2,
    ORANGE = 3,
    // ...
}

Моя конечная цель - иметь возможностьиспользуйте значение enum, чтобы найти строку во время компиляции и наоборот:

myenum toEnum(const char* str) { /* ... */ }
const char* toString(myenum e) { /* ... */ }

Как бы я поступил так?Если это невозможно, есть ли другой способ сделать то же самое?

1 Ответ

2 голосов
/ 17 марта 2019

Обычный способ сделать это - поместить список вызовов SOME_MACRO в отдельный заголовочный файл, затем дважды #include этот файл, каждый раз определяя SOME_MACRO по-разному.Что-то вроде этого:

#define SOME_MACRO(name, text) text,
const char* myarray[] = {
  #include "mylist.h"
};
#undef SOME_MACRO

#define SOME_MACRO(name, text) name,
enum myenum
{
  #include "mylist.h"
};
#undef SOME_MACRO

Другой распространенный способ сделать это - определить данные на некотором языке сценариев (например, Python), а затем написать простой сценарий, который генерирует источники C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...