C++ 如何声明指向成员stuff m_pmd/m_pmf的成员指针并访问它们? 结构 { 模板void F(){}; int i; int S::*m_pmd;//编译正常 void(S::*m_pmf)(;//编译正常 }; S S; void(S::*pmf)(=&S::F; (s.*pmf)()//呼叫确定 int S::*pmd=&S::i; s、 *pmd=123//pmd呼叫正常 s、 m_pmd=&s::i;//编译ok s、 m_pmf=&s::F//编译ok //现在问题出现了? s、 *m_pmd//错误。。。? s、 *m_pmf//错误。。。?

C++ 如何声明指向成员stuff m_pmd/m_pmf的成员指针并访问它们? 结构 { 模板void F(){}; int i; int S::*m_pmd;//编译正常 void(S::*m_pmf)(;//编译正常 }; S S; void(S::*pmf)(=&S::F; (s.*pmf)()//呼叫确定 int S::*pmd=&S::i; s、 *pmd=123//pmd呼叫正常 s、 m_pmd=&s::i;//编译ok s、 m_pmf=&s::F//编译ok //现在问题出现了? s、 *m_pmd//错误。。。? s、 *m_pmf//错误。。。?,c++,C++,首先可以在类型S之外声明pmd/pmf,并通过S.*访问它 但是,如果我们在类型本身内部声明pmd/pmf,如何访问它们?只需递归地应用相同的规则 您已经知道(并表明)要在obj上调用mfptr,您必须执行(obj.*mfptr)() 现在您想在s上调用s.m_pmf(大概是这样) 因此: () 恶心。也许用一些好的羊肉来代替 struct S { template <auto> void F(){}; int i; int S::* m_pmd; //com

首先可以在类型S之外声明pmd/pmf,并通过S.*访问它


但是,如果我们在类型本身内部声明pmd/pmf,如何访问它们?

只需递归地应用相同的规则

您已经知道(并表明)要在
obj
上调用
mfptr
,您必须执行
(obj.*mfptr)(

现在您想在
s
上调用
s.m_pmf
(大概是这样)

因此:

() 恶心。也许用一些好的羊肉来代替

struct S
{
    template <auto> void F(){};
    int i;
    int S::* m_pmd; //compiles ok
    void (S::* m_pmf) (); //compiles ok
};

S s;
void (S::* pmf)()=&S::F<true>;
(s.*pmf)(); //pmf call ok
int S::* pmd=&S::i;
s.*pmd =123; //pmd call ok

s.m_pmd=&S::i; // compiles ok
s.m_pmf=&S::F<123>; //compiles ok

//now the problem occurred ... ?
s.*m_pmd; //error...?
s.*m_pmf; //error...?
s.*(s.m_pmd);
(s.*(s.m_pmf))();