是否可以使用指向成员的指针来获取实际指针?

时间:2014-12-31 18:32:15

标签: c++ pointers pointer-to-member

我有一些结构或类example,我需要在某处向其任何成员发送指针。

void send_ptr(void *ptr, std::size_t size);

struct obj {};

struct example {
    int a;
    obj b;

private:
    static void send_ptr(void *ptr, std::size_t size) {}

public:
    template <typename M>
    void send_member(M *member) {
        send_ptr(member, sizeof(M));
    }

这个工作正常,但我想我可以在这里使用指向成员来引入一点静态检查。 (send_member的上述实现实际上可以发送任意指针。)

    template <typename M>
    void send_member(M example::*member) {
        send_ptr(&this->*member, sizeof(M));
    }
};

这会失败,因为指向成员的取消引用(this->*member)显然会计算为右值。

error: lvalue required as unary ‘&’ operand
        send_ptr(&this->*member, sizeof(M));
                  ^

现在,我认为我可以聪明并尝试

&static_cast<M &>(this->*member)

这似乎有效,但说实话,我并不完全明白如何。也许这是不安全的。我知道static_cast有时可以这种方式使用(如完美转发),但我不完全理解这里的语义。

那么可以使用指向成员的指针来可靠地获取指向成员的实际指针吗? static_cast是否有效(如果是的话,你可以解释一下)吗?或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:3)

operator&的{​​{3}}大于operator->*operator.*&首先绑定到this operator precedence,而不是prvalue,您可以获取该地址。使用括号对评估进行排序:

send_ptr(&(this->*member), sizeof(M));