boost-preprocessor - 带 Boost.Preprocessor 的 X 宏?

标签 boost-preprocessor x-macros

将其与我关于 appending to CPP macros 的问题分开:

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

最佳答案

我刚刚查了一下 X-Macro应该是,我想我做了类似你要求的事情。

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

为了解决这个问题,我首先定义了 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 预处理器不会生成非常可读的代码,因此我尝试使 for 每个宏使用的宏尽可能简单。如果有人对这个问题有更优雅的解决方案,我也不会感到惊讶。这正是我为个人项目想到的,我不介意额外的复杂性。

关于boost-preprocessor - 带 Boost.Preprocessor 的 X 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550987/

相关文章:

c++ - 如何创建代理类?

使用可变参数和后期扩展创建字符串化宏参数列表

c++ - 通过自定义宏构造 boost::fusion::map(以及更多)

连接 X 宏的多个标记

c++ - 预处理器#include指令和宏扩展

c++ - boost::function 如何支持不同长度模板参数的模板类

c++ - BOOST_PP_SEQ_ENUM 空序列

c++ - C++ 宏中的函数式编程风格 : Is this documented anywhere?

c - X-Macros 的实际使用

c++ - 创建宏以将 token (参数)一个一个地收集到列表中