Khu*_*dov 4 c++ boost boost-preprocessor
我有这样的结构:
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;
};
Run Code Online (Sandbox Code Playgroud)
问:我如何使用BOOST预处理器创建这个结构?对我来说只知道type_A,type_B,...,type_X类型的名称.
这需要我,因为我必须创建很多这样的结构,只改变type_A,type_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;
};
Run Code Online (Sandbox Code Playgroud)
该N参数对应的maNamespace参数.您当然可以以任何其他方式使用此参数(它只是通过逐字传递),例如硬编码N到宏中(并在参数中传递虚拟),或者甚至编码data那里的标识符等.