3

いくつかのログ機能を生成するブースト プリプロセッサ マクロを作成しようとしています。私は現在、単純なシーケンスで動作する実際の例を持っています(つまり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が正しく展開されないためだと理解しています。

私はプリプロセッサのメタプログラミングが初めてで、必要なデータを正しく展開/抽出するために何を使用すればよいかわかりません。

4

0 に答える 0