Я не думаю, что BOOST_PP_SEQ_CONTAINS
может быть реализовано. Для этого вам потребуется сравнить две последовательности токенов предварительной обработки, чего вы не можете сделать.
Однако, если вы немного перестроите свою логику, вы можете получить что-то ближе к тому, что вы хотите. Во-первых, нам нужна пара вспомогательных макросов для использования с BOOST_PP_SEQ_FOR_EACH
:
#include <boost/preprocessor.hpp>
// General purpose macros:
#define EXPAND_ENUM_CASE_2(text1, text2) text1 ## text2
#define EXPAND_ENUM_CASE(r, data, elem) \
case elem : EXPAND_ENUM_CASE_2(data ## _ ## CASE ## _ , elem)
Мы можем определить список перечислителей и перечисление так же, как в исходном вопросе:
#define WORKDAY_ENUMERATORS (Monday)(Tuesday)(Wednesday)(Thursday)
enum Workday { BOOST_PP_SEQ_ENUM(WORKDAY_ENUMERATORS) };
Как вы можете видеть, я исключил пятницу из списка, потому что никто не работает в пятницу. Давайте рассмотрим в качестве примера функцию, которая возвращает некоторый текст, описывающий день недели.
Вместо того, чтобы проверять, был ли перечислитель включен в список, мы определяем регистры для каждого из значений, используя макросы:
#define WORKDAY_CASE_Monday { return "Mondays suck"; }
#define WORKDAY_CASE_Tuesday { return "Tuesdays are better than Mondays"; }
#define WORKDAY_CASE_Wednesday { return "Hooray for humpday!"; }
#define WORKDAY_CASE_Thursday { return "Thursdays are okay"; }
#define WORKDAY_CASE_Friday { return "No one really works on Friday"; }
Затем мы генерируем правильные операторы case для списка, используя WORKDAY_ENUMERATORS
и объединяя перечислители с префиксом WORKDAY_CASE_
:
const char* get_day_text(Workday d)
{
switch (d)
{
BOOST_PP_SEQ_FOR_EACH(EXPAND_ENUM_CASE, WORKDAY, WORKDAY_ENUMERATORS)
}
return "WTF?! That's not a workday!";
}
Если день не был включен в список WORKDAY_ENUMERATORS
, для него не будет создано ни одного случая.
Поскольку мы должны быть вежливы, когда используем препроцессор, тогда мы отменяем определение используемых макросов:
#undef WORKDAY_CASE_Monday
#undef WORKDAY_CASE_Tuesday
#undef WORKDAY_CASE_Wednesday
#undef WORKDAY_CASE_Thursday
#undef WORKDAY_CASE_Friday
Я думаю, это немного уродливо, но это один из способов получить почти те результаты, которые вы ищете.