当为该变量提供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/

10-11 22:48
查看更多