gpt4 book ai didi

c++ - 没有临时实例的成员指针的偏移量

转载 作者:可可西里 更新时间:2023-11-01 15:12:42 24 4
gpt4 key购买 nike

当提供一个指向该变量的指针时,我想获得标准布局成员变量的偏移量。我不能使用 offsetof 因为我有一个指针而不是一个名字。我目前的代码看起来像这样,我想知道是否有一种符合标准的方法来摆脱 dummy 变量。

template<class T>
struct {
ptrdiff_t get_offset( int (T::*mem) )
{
T dummy;
return reinterpret_cast<char*>(&(dummy.*mem))
- reinterpret_cast<char*>(&dummy);
}
};

这个函数应该只能用 int 成员变量点调用(这是有意的)。

我很确定编译器实际上并没有创建 dummy 变量,但如果我能摆脱它,它仍然很好。我不能使用空指针,因为未定义取消引用 null(尽管它可能适用于所有常见的编译器)。 C++03 解决方案会很好,或者 C++11 解决方案也很有趣(但我现在无法使用)。

注意:我已经知道这只是符合标准,因为 T 是标准布局类型。

最佳答案

怎么样:

template<class T>
struct {
ptrdiff_t get_offset( int (T::*mem) )
{
union {
int used;
T unused;
} dummy;
return reinterpret_cast<char*>(&(dummy.unused.*mem))
- reinterpret_cast<char*>(&dummy.unused);
}
};

union 成员的地址不依赖于正在构造的 union 成员。已经在 C++03 中工作,但仅适用于 POD。

关于c++ - 没有临时实例的成员指针的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com