指向成员的指针的偏移量

0xb*_*00d 5 c++ templates member-pointers

template<class T, typename U> ptrdiff_t foo(T U::* m)
{
    // return offset
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何获得字段'm'的偏移量?我更喜欢使用am编译时表达式.

在此先感谢您的帮助.最好的祝福

0xb*_*00d 5

@Michael J.

感谢您的回答.这不是我想要的,但它给了我这样做的灵感:

template<class T, typename U>
std::ptrdiff_t member_offset(U T::* member)
{
    return reinterpret_cast<std::ptrdiff_t>(
        &(reinterpret_cast<T const volatile*>(NULL)->*member)
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 你在这里取消了一个空指针.这是不允许的,除非你正在实现库,获得一个特殊的分配用于offsetof宏.有人打败我-1. (3认同)
  • 不同之处在于offsetof为**特定编译器**做了这一点,并且只是因为库设计者已经与编译器编写者做了特殊处理.然后它可能会工作.在其他编译器上,offsetof用作特殊的__builtin_offsetof函数.或者其他一些技巧.在库中使用offsetof的主要原因是你无法编写它,你需要编译器的特殊支持. (3认同)

Mic*_*l J 3

听起来您正在寻找offsetof()宏。

  • 使用成员指针调用“offsetof”是不合法的,而仅使用成员名称。(在许多实现中它可能有效,但考虑到这种事情是多么晦涩难懂,它可能会在任何编译器更新中中断) (4认同)