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

How does this C++ template member function declaration work?

本文关键字:何工作 工作 声明 C++ 成员 函数      更新时间:2023-10-16

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

Member Class::*p它是

指向类型为 Member 的类 Class 成员的指针。所以,这样的事情会称它是真的

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

其中x是类型为 T 的成员变量,类型为 int

来自您链接的文档

#define BOOST_REFLECT_VISIT_MEMBER( r, visitor, elem ) 
visitor.template operator()
<BOOST_TYPEOF(type::elem),type,&type::elem>( BOOST_PP_STRINGIZE(elem) );

Member Class::*p表示p是指向Class类型Member成员的指针。

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

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

你可以这样称呼它:

xml_printer<foo> printer;
printer.operator()<some_type, foo, &foo::bar>("some string literal");