将此从我的问题中分开 附加到CPP宏:

这里有人使用过 BOOST.PREPROCESOR 图书馆的数据类型以实现X-MaCro之类的内容?

有帮助吗?

解决方案

我只是看着什么 X-MaCro 应该是,我想我做的类似于您想要的事情。

我想做的是轻松,快速地支持一系列相似的类别的序列化。我遇到的问题是,我必须将一些运行时信息(一个INT)转换为编译时间类型(类)才能完成我的序列化。我本可以写几个案例语句来完成这项工作,但这意味着每次我想添加一堂课时,我都必须更新多个功能。

为了解决这个问题,我首先定义 序列元组 包含映射:

#define WIN_MESSAGE_TYPE_SEQ \
    ((EM_REPLACESEL, em_replacesel))((WM_CHAR, wm_char)) //...

上情况名称定义为持有int,较低的案例名称是我在其他地方定义的类。

然后,我可以将此序列与某些序列结合使用 提升预处理器 为我生成各种代码。例如,要获取课程的远期声明,我可以做到这一点:

#define WIN_MESSAGE_TYPE_BUILD_MACRO(r, _data_, _elem_) \
    class BOOST_PP_TUPLE_ELEM(2,1,_elem_);

BOOST_PP_SEQ_FOR_EACH(WIN_MESSAGE_TYPE_BUILD_MACRO, BOOST_PP_NIL, WIN_MESSAGE_TYPE_SEQ)

#undef WIN_MESSAGE_TYPE_BUILD_MACRO

为了进行运行时间来编译时间映射,我生成了一系列类似的案例语句:

#define WIN_MESSAGE_TYPE_BUILD_MACRO(r, _data_, _elem_) \
    case BOOST_PP_TUPLE_ELEM(2,0,_elem_): return win_message_serializer<BOOST_PP_TUPLE_ELEM(2,1,_elem_)>::serialize(msg, o_arch);

template <typename Archive>
void serialize_win_message (p_win_message_base msg, Archive& o_arch) {
    message_type_t message_type = msg->type();

    switch (message_type) {

    // This will generate a series of case statement for each message type that will invoke
    // the serializer for the correct types.
    BOOST_PP_SEQ_FOR_EACH(WIN_MESSAGE_TYPE_BUILD_MACRO, BOOST_PP_NIL, WIN_MESSAGE_TYPE_SEQ)

    default: //...
    };
}

#undef WIN_MESSAGE_TYPE_BUILD_MACRO

整个代码涉及的范围要大得多,但这仍然应该使您了解如何使用Boost预处理器生成代码。在我的示例中,我可以通过简单地更新我的顺序来快速,轻松地添加对类的序列化支持。

请注意,使用Boost预处理器不会产生非常可读的代码,因此我尝试将每个宏所使用的宏所使用的宏尽可能简单。另外,如果某个地方对此问题有更优雅的解决方案,我也不会感到惊讶。这正是我为一个个人项目提出的,我不介意额外的复杂性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top