这个C ++模板成员函数声明如何工作?

时间:2013-10-18 10:33:13

标签: c++ templates

以下是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部分。如果我理解正确,这个类型参数就位,以便访问者能够解析该成员,这是该库以某种方式为该成员存储的类型信息。但是,对于我而言,看起来很不寻常,有两种类型相继写入。你能解释一下这是如何工作的,或者可能提供一个用这种声明调用函数的例子吗?

3 个答案:

答案 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");