【问题标题】:X-Macros with Boost.Preprocessor?带有 Boost.Preprocessor 的 X 宏?
【发布时间】:2010-12-29 02:06:23
【问题描述】:

从我关于appending to CPP macros的问题中分离出来:

这里有没有人使用Boost.Preprocessor 库的数据类型来实现类似 X 宏的东西?

【问题讨论】:

    标签: boost-preprocessor x-macros


    【解决方案1】:

    我刚刚查找了X-Macro 应该是什么,我想我做了你所要求的事情。

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

    为了解决这个问题,我首先定义了包含映射的a sequencetuples

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

    大写名称是包含 int 的定义,小写名称是我在其他地方定义的类。

    然后我可以将此序列与一些Boost preprocessors 结合使用,为我生成各种代码。例如,要获得类的前向声明,我可以这样做:

    #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
    

    为了做运行时编译时间映射,我生成了一系列这样的case语句:

    #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 预处理器不会产生可读性很强的代码,因此我尽量让每个宏使用的宏尽可能简单。此外,如果某个地方的某个人对这个问题有更优雅的解决方案,我也不会感到惊讶。这正是我为一个我不介意额外复杂性的个人项目提出的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      相关资源
      最近更新 更多