Удалить пробелы из символа

Я использую последовательности препроцессора Boost для генерации enums, поэтому, например, у меня есть такое определение, как

#define DESERTS (Cheesecake)(Apple Pie)(Merengue)

Теперь я хочу сгенерировать оба разумные enum class, а также потоковые операции вывода. С последними все в порядке, а с первыми нет, потому что я не знаю, как изменить, скажем, (Apple Pie) на элемент перечисления, в котором нет пробела, т. е. ApplePie. Возможно ли это сделать с помощью магии препроцессора Boost?


person Dmitri Nesteruk    schedule 18.04.2015    source источник


Ответы (1)


Не совсем с этим вводом, но есть обходные пути. Самое разумное, что я могу придумать, это изменить входные данные, чтобы слова многословного идентификатора можно было обрабатывать отдельно:

#define DESSERTS ((Cheesecake))((Apple)(Pie))((Merengue))

Поскольку части идентификатора теперь являются частями последовательности, вы можете сгенерировать класс перечисления и связанные имена с BOOST_PP_SEQ_FOLD_LEFT следующим образом:

#define DUMP_NORMAL(d, state, x) state x
#define DUMP_CONCAT(d, state, x) BOOST_PP_CAT(state, x)

#define MAKE_STRING(r, data, seq) BOOST_PP_STRINGIZE(BOOST_PP_SEQ_FOLD_LEFT(DUMP_NORMAL, , seq)),
#define MAKE_IDENTIFIER(r, data, seq) BOOST_PP_SEQ_FOLD_LEFT(DUMP_CONCAT, , seq),

enum class Desserts {
  BOOST_PP_SEQ_FOR_EACH(MAKE_IDENTIFIER, _, DESSERTS)
};

char const *const DessertNames[] = {
  BOOST_PP_SEQ_FOR_EACH(MAKE_STRING, _, DESSERTS)
};
person Wintermute    schedule 18.04.2015