【发布时间】:2012-08-27 11:52:06
【问题描述】:
当提供一个指向该变量的指针时,我想获得标准布局成员变量的偏移量。我不能使用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 是标准布局类型。
【问题讨论】:
-
返回类型应该是
ptrdiff_t,我想,你应该使用std::distance。函数应该是static。 -
@KerrekSB,是的。我在 GCC 中使用完整/额外警告进行编译,但我猜是
size_t == ptrdiff_t,所以没有警告。 -
ptrdiff_t已签名...无论如何,我想dummy也应该是静态的。 -
@Andrey,但这是一个实现细节,在每个编译器中可能会有所不同。
-
另一个小的改进是使用类似Boost.AddressOf的东西,以确保这适用于重载
operator&的类型。
标签: c++