2

Boost.Reflect ライブラリのドキュメントのスニペットを次に示します。

template<typename T>
struct xml_printer {
    xml_printer( const T& c ):self(c){}

    template<typename Type> 
    static xml_printer<Type> make( const Type& t ) {
        return xml_printer<Type>(t);
    }

    template<typename Member, typename Class, Member Class::*p>
    void operator()( const char* name )const {
        std::cerr<<"<"<<name<<">"<<(self.*p)<<"</"<<name<<">\n";
    }
    const T& self;
};

私が混乱している部分はoperator()、ビジターでの宣言です:

template<typename Member, typename Class, Member Class::*p>
void operator()( const char* name )const

特にそのMember Class::*p部分。私の理解が正しければ、この型パラメーターは、訪問者がメンバーを解決できるようにするために用意されています。これは、ライブラリーが何らかの形でメンバーのために格納する型情報です。しかし、2 つのタイプが交互に書かれているのは、私には非常に珍しいように見えます。これがどのように機能するか、またはそのような宣言で関数を呼び出す例を教えてください。

4

3 に答える 3