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部分。如果我理解正确,这个类型参数是为了让访问者能够解析成员,这是图书馆以某种方式为成员存储的类型信息。但是,对我来说,这两种类型的写法看起来很不寻常。您能否向我解释一下这是如何工作的,或者提供一个示例来调用具有此类声明的函数?

4

3 回答 3

1

Member Class::*p它是指向Classtype的类成员的指针Member。所以,像这样的事情会说它是真的

auto printer = xml_printer<T>();
printer.template operator()<int, T, &T::x>("x");

其中x是 typeT类型的成员变量int

从文档中,您链接

#define BOOST_REFLECT_VISIT_MEMBER( r, visitor, elem ) \
visitor.template operator()
<BOOST_TYPEOF(type::elem),type,&type::elem>( BOOST_PP_STRINGIZE(elem) );
于 2013-10-18T10:40:39.973 回答
1

Member Class::*p表示这p是一个指向Classtype 成员的指针Member

它与模板声明无关,它只是用于指向成员声明的 C++ 语法。

于 2013-10-18T10:40:56.300 回答
0

指向成员的指针是有效的模板参数(参见 C++11 标准 14.1/4)。

你会这样称呼它:

xml_printer<foo> printer;
printer.operator()<some_type, foo, &foo::bar>("some string literal");
于 2013-10-18T10:43:48.817 回答