如何声明成员指针m_pmd / 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类型之外声明pmd / pmf并通过s。* ...访问它。

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

评论
  • Yi心情
    Yi心情 回复

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

    You already know (and showed) that to invoke mfptr on obj, you do (obj.*mfptr)().

    Now you want to invoke s.m_pmf on s (presumably).

    所以:

    s.*(s.m_pmd);
    (s.*(s.m_pmf))();
    

    (live demo)

    uck也许可以使用一些漂亮的lambda代替?