2013-10-18 21 views
2

下面是從documentation of the Boost.Reflect library片段:這個C++模板成員函數聲明是如何工作的?

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部分。如果我理解正確,這個類型參數是爲了讓訪問者能夠解析成員,並且這是圖書館以某種方式爲成員存儲的類型信息。然而,對於我來說,看起來很不尋常,有兩種類型的文字。你能向我解釋這是如何工作的,或者可能提供一個可以用這種聲明調用函數的例子嗎?

回答

1

Member Class::*p它是指向Class類型的成員,類型Member。 所以,這樣的事情會調用它的真實

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

其中xintT類型的成員變量。

從文檔,您關聯

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

Member Class::*p意味着p是指向Member類型的Class構件。

它與模板聲明無關,它只是指向成員聲明的C++語法。

0

指向成員的指針是有效的模板參數(請參閱C++ 11標準14.1/4)。

你會這樣稱呼它:

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