是否有可能使用指针到成员得到一个实际的指针?(Is it possible to use a poi

2019-10-21 12:09发布

我有一些结构或类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工作(如果是的话,你能解释一下如何)? 还是有更简单的方法?

Answer 1:

operator&具有更大的运算符优先级高于operator->*operator.* 。 在&将绑定到this首先是一个prvalue ,而不是一个glvalue其中您可以采取的地址。 用括号来排序的评价:

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


文章来源: Is it possible to use a pointer-to-member to get an actual pointer?