当提供指向该变量的指针时,我想获取标准布局成员变量的偏移量。我无法使用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);
}
};
联合成员的地址不依赖于正在构造的联合成员。已在 C++03 中运行,但仅适用于 POD。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)