我试图从指向成员变量的指针获取实际对象的指针。获取对象的地址从它的指针到成员变量
是的,我知道有offsetof
宏,但它需要一个成员变量的名称,而不是指向成员变量的指针。
它实际上并不难实现,但我不确定它是100%标准的一致性代码。
template <class T, class M, M T::*Ptr>
constexpr std::ptrdiff_t offset_to_member()
{
return static_cast<char*>(static_cast<void*>(&(static_cast<T*>(nullptr)->*Ptr)))
- static_cast<char*>(nullptr);
}
template <class T, class M, M T::*Ptr>
constexpr T* object_ptr_from_member(M *__ptr)
{
// reinterpret_cast is not allowed in constexpr function
return static_cast<T*>(static_cast<void*>(
static_cast<char*>(static_cast<void*>(__ptr)) - offset_to_member<T, M, Ptr>()));
}
锵++和g ++编译都没有任何警告的代码,但我需要比“似乎工作”等等。
代码是否在C++ 11标准中有效?
并且* this *如何不需要成员的“名称”? – 2014-12-04 11:22:36
没有符合标准的方法来做到这一点。编译器不会警告你,因为你告诉他们关闭并编译(强制转换)。 – 2014-12-04 11:33:16
@JoachimPileborg你能用'offsetof'实现'object_ptr_from_member'吗?这是给定的条件。为什么我会问这个问题,我是否可以根据需要改变一切? – kukyakya 2014-12-04 11:37:26