当为该变量提供Poiner时,我想获取标准布局成员变量的偏移量。我不能使用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指针,因为未定义对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/