Использование препроцессора 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.
Любая помощь или направление приветствуется!