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

标签 c++

当提供一个指向该变量的指针时,我想获得标准布局成员变量的偏移量。我不能使用 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/

相关文章:

c++ - C++ 类中的静态常量初始化结构数组

c++ - 断言中的 dynamic_cast 导致错误

c++ - 媒体文件无法切换播放

c++ - QT C++中对全局变量的 undefined reference

c++ - DirectX:如何更改按钮对象的字体大小?

c++ - Eisenberg-McGuire算法段错误: 11 in C的实现

c++ - MSVC 中的 "vector<bool> iterator not dereferencable"错误但使用 g++ 编译时工作正常

c++ - 使用将变量作为参数的函数初始化变量

c++ - "#define TYPE(x) typename decltype(x)"是个坏主意吗?

c++ - 为什么我不能制作引用 vector ?