我正在尝试编写一些生成一些日志记录功能的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
无法正确扩展。
我是预处理器元编程的新手,我不知道应该使用什么来正确扩展/提取所需数据。