Использование препроцессора boost для создания перечисления с явным значением

Я пытаюсь использовать библиотеку препроцессора Boost для создания enum из списка (name, value) пар. Очевидно, что это не особенно полезно само по себе, но намерение состоит в том, чтобы связать это вместе с другим фрагментом кода, который я написал для преобразования enum значения в и из строк автоматически.

Вот упрощенная версия того, с чем я сейчас работаю.

# include <boost/preprocessor.hpp>
# include <iostream>

# define NAGA_PP_ENUM_NUMBERED_SEQ_X(s, data, elem) BOOST_PP_TUPLE_ELEM(0, elem) = BOOST_PP_TUPLE_ELEM(1, elem)

# define NAGA_PP_ENUM_NUMBERED(name, enumerators) \
    enum class name \
    { \
        BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(NAGA_PP_ENUM_NUMBERED_SEQ_X, ~, enumerators)) \
    };

NAGA_PP_ENUM_NUMBERED(Planets,
    (MERCURY, -1)
    (VENUS, 32)
    (EARTH, 39)
    (MARS, 44)
    (JUPITER, 45)
    (SATURN, 46)
    (URANUS, 48)
    (NEPTUNE, 50)
)

int main()
{
    std::cout << Planets::MARS << std::endl;    // should print out "44"
}

Я ожидаю, что это расширится до этого:

enum class Planets
{
    MERCURY = -1,
    VENUS = 32,
    EARTH = 39,
    MARS = 44,
    JUPITER = 45,
    SATURN= 46,
    URANUS= 48,
    NEPTUNE = 50,
};

Тем не менее, это не работает, и я получаю ошибки ниже:

prog.cpp:21:1: error: macro "BOOST_PP_SEQ_SIZE_0" passed 2 arguments, but takes just 1
 )
 ^                       
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_ELEM_0" passed 2 arguments, but takes just 1
 )
 ^                  
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_ELEM_III" requires 2 arguments, but only 1 given
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_TAIL_I" passed 2 arguments, but takes just 1
 )
 ^                       
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_TAIL_I" passed 2 arguments, but takes just 1
 )
 ^             
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_TAIL_I" passed 2 arguments, but takes just 1
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_TAIL_I" passed 2 arguments, but takes just 1
 )
 ^                      
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_TAIL_I" passed 2 arguments, but takes just 1
prog.cpp:21:1: error: macro "BOOST_PP_SEQ_TAIL_I" passed 2 arguments, but takes just 1
prog.cpp:21:1: error: macro "BOOST_PP_VARIADIC_ELEM_2" requires 4 arguments, but only 2 given
 )
 ^                       
In file included from /usr/include/boost/preprocessor/control/while.hpp:17:0,
                 from /usr/include/boost/preprocessor/arithmetic/add.hpp:20,
                 from /usr/include/boost/preprocessor/arithmetic.hpp:17,
                 from /usr/include/boost/preprocessor/library.hpp:16,
                 from /usr/include/boost/preprocessor.hpp:17,
                 from prog.cpp:1:
prog.cpp:9:27: error: expected ‘}’ before ‘BOOST_PP_SEQ_TAIL_I’
         BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(NAGA_PP_ENUM_NUMBERED_SEQ_X, ~, enumerators)) \
                           ^
prog.cpp:12:1: note: in expansion of macro ‘NAGA_PP_ENUM_NUMBERED’
 NAGA_PP_ENUM_NUMBERED(Planets,
 ^~~~~~~~~~~~~~~~~~~~~
prog.cpp:9:27: error: expected initializer before ‘BOOST_PP_VARIADIC_ELEM_2’
         BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(NAGA_PP_ENUM_NUMBERED_SEQ_X, ~, enumerators)) \
                           ^
prog.cpp:12:1: note: in expansion of macro ‘NAGA_PP_ENUM_NUMBERED’
 NAGA_PP_ENUM_NUMBERED(Planets,
 ^~~~~~~~~~~~~~~~~~~~~
prog.cpp:10:5: error: expected declaration before ‘}’ token
     };
     ^
prog.cpp:12:1: note: in expansion of macro ‘NAGA_PP_ENUM_NUMBERED’
 NAGA_PP_ENUM_NUMBERED(Planets,
 ^~~~~~~~~~~~~~~~~~~~~

Я думаю, что я могу что-то упустить из-за того, как синтаксис последовательности кортежей должен работать. Имейте в виду, я собираюсь против MSVC 2013.

Любая помощь или направление приветствуется!

0 ответов

Другие вопросы по тегам