BOOST_PP_REPEAT с массивом

У меня есть структура, как:

struct E1
{
typedef boost::tuple<
boost::optional< N::type_A >, // N - namespace
boost::optional< N::type_B >,
...................
boost::optional< N::type_X > //arbitrary number of, maximal is 7
> data_type;// for access by name
boost::optional<N::type_A> const&  type_A() const { return boost::get<0>(data); }
boost::optional<N::type_B> const&  type_B() const { return boost::get<1>(data); }
.....................................
boost::optional<N::type_X> const&  type_X() const { return boost::get<2>(data); }

data_type data;
};

Q: как я могу создать эту структуру, используя препроцессоры BOOST? Для меня известны только type_A, type_B, …, type_X названия типов.

Это нужно мне, потому что я должен создать много подобных структур, меняя только типы type_A, type_B, ….

В общем случае, я могу использовать массив препроцессора boost или set?

4

Решение

Вы можете сделать это так:

#define TYPES (type_A)(type_B)(type_X)#define GENERATE_TUPLE(maR, maNamespace, maIndex, maType) \
BOOST_PP_COMMA_IF(maIndex) boost::optional<maNamespace :: maType>#define GENERATE_GETTER(maR, maNamespace, maIndex, maType) \
boost::optional<maNamespace :: maType> const& maType () const { return boost::get<maIndex>(data); }struct E1
{
typedef boost::tuple<
BOOST_PP_SEQ_FOR_EACH_I(GENERATE_TUPLE, N, TYPES)
> data_type;

BOOST_PP_SEQ_FOR_EACH_I(GENERATE_GETTER, N, TYPES)

data_type data;
};

N Аргумент соответствует maNamespace параметр. Конечно, вы можете использовать этот аргумент любым другим способом (он просто передается дословно), например, жестким кодом N в макросах (и передавая фиктив в аргументе), или кодируя даже идентификатор data там и т. д.

7

Другие решения

Других решений пока нет …