我有一些结构或类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
是否有效(如果是的话,你可以解释一下)吗?或者有更简单的方法吗?
答案 0 :(得分:3)
operator&
的{{3}}大于operator->*
和operator.*
。 &
首先绑定到this
operator precedence,而不是prvalue,您可以获取该地址。使用括号对评估进行排序:
send_ptr(&(this->*member), sizeof(M));