BOOST_PP_REPEAT with array

BOOST_PP_REPEAT with array

本文关键字:array with PP BOOST REPEAT      更新时间:2023-10-16

我有这样的结构:

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预处理器创建此结构?对我来说,只知道类型_A,类型_B。。。,type_X类型的名称。

它需要我,因为我必须创建很多这样的结构,只更改类型_a、类型_B。。。类型。

在常见情况下,我可以使用boost预处理器阵列还是集合?

你可以这样做:

#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,等等。