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 つのタイプが交互に書かれているのは、私には非常に珍しいように見えます。これがどのように機能するか、またはそのような宣言で関数を呼び出す例を教えてください。