いくつかのログ機能を生成するブースト プリプロセッサ マクロを作成しようとしています。私は現在、単純なシーケンスで動作する実際の例を持っています(つまり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_) )
これは、要素が「タプル」になり、マクロ BOOST_PP_SEQ_FOR_EACH
が正しく展開されないためだと理解しています。
私はプリプロセッサのメタプログラミングが初めてで、必要なデータを正しく展開/抽出するために何を使用すればよいかわかりません。