以下是documentation of the Boost.Reflect library:
的摘录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
部分。如果我理解正确,这个类型参数就位,以便访问者能够解析该成员,这是该库以某种方式为该成员存储的类型信息。但是,对于我而言,看起来很不寻常,有两种类型相继写入。你能解释一下这是如何工作的,或者可能提供一个用这种声明调用函数的例子吗?
答案 0 :(得分:1)
Member Class::*p
它指向类Class
的成员Member
。
所以,像这样的东西会称之为真实的
auto printer = xml_printer<T>();
printer.template operator()<int, T, &T::x>("x");
其中x
是类型为T
的{{1}}类型的成员变量。
来自文档,您链接
int
答案 1 :(得分:1)
Member Class::*p
表示p
是指向Class
类型Member
成员的指针。
它与模板声明无关,它只是指向成员声明的C ++语法。
答案 2 :(得分:0)
指向成员的指针是有效的模板参数(参见C ++ 11标准14.1 / 4)。
你会这样称呼它:
xml_printer<foo> printer;
printer.operator()<some_type, foo, &foo::bar>("some string literal");