提升预处理器:访问元组序列中的元素

时间:2014-11-06 14:50:18

标签: c++ boost macros boost-preprocessor

我正在尝试编写一些生成一些日志记录功能的boost预处理器宏。我目前有一个工作示例,它使用简单的序列(即FUNC( (a)(b)(c)(d) )。)

#include <boost/preprocessor.hpp>
#include <iostream>
#include <string>

#define X_DEFINE_ELEMENT_DISPLAY( r, data, elem ) \
    std::cerr << "( " << BOOST_PP_STRINGIZE( elem ) << " : " << v.elem << " ) ";

#define DEFINE_DISPLAY_FUNC( type, params )                 \
    void display( const type& v )                           \
    {                                                       \
        std::cerr << BOOST_PP_STRINGIZE( type ) << "{ ";    \
        BOOST_PP_SEQ_FOR_EACH(                              \
                X_DEFINE_ELEMENT_DISPLAY,                   \
                type, params )                              \
        std::cerr << " }\n";                                \
    }

struct MyStruct
{
    int   p1_;
    std::string p2_;
    unsigned    p3_;
};

DEFINE_DISPLAY_FUNC( MyStruct, (p1_)(p2_)(p3_) )

int main( int, char** )
{
    MyStruct s{ 23, "hello", 5467u };

    display( s );
    return 0;
}

如果我修改代码以使用一系列元组(类似于BOOST_FUSION_ADAPT_STRUCT),宏扩展将失败:

DEFINE_DISPLAY_FUNC( MyStruct, (int, p1_)(std::string, p2_)(unsigned, p3_) )

我知道这是因为元素现在是&#34;元组&#34;这导致宏BOOST_PP_SEQ_FOR_EACH无法正确扩展。

我是预处理器元编程的新手,我不知道应该使用什么来正确扩展/提取所需数据。

0 个答案:

没有答案