从指向成员变量的指针获取对象的地址
Getting object's address from its pointer to member variable
我正在尝试从指向成员变量的指针获取实际对象的指针。
是的,我知道有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>()));
}
结果 : http://ideone.com/1Z2nIR
Clang++ 和 g++ 都在没有任何警告的情况下编译了代码,但我需要的不仅仅是"它似乎有效"。
代码在 c++11 标准中有效吗?
static_cast<T*>(nullptr)->*Ptr
等效于 根据 [expr.mptr.oper]/3 (*static_cast<T*>(nullptr)).*Ptr
,这会触发未定义的行为。
而不是constexpr
(正是因为 UB) - [expr.const]/2:
条件表达式
e
是核心常量表达式,除非e
的评估,遵循抽象机器的规则,将 计算以下表达式之一:
- 具有未定义行为的操作。
相关文章:
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 通过基类指针获取派生类对象的引用
- C++从双指针获取数据
- 如何从原始指针获取shared_ptr?
- 如何从C++中的字符指针获取子字符串
- 使用 std::launder 从指向非活动工会成员的指针获取指向活动工会成员的指针?
- 使用我的共享指针获取内存泄漏
- 通过指向非多态类型的基类的指针获取已分配内存的地址
- 指向引用的指针获取器
- 使用 std::launder 从指向非活动对象的指针获取指向活动对象成员的指针?
- CPP:无法使用 -> 通过指针获取成员的值
- 字符串十六进制到指针获取值
- 从基类指针获取模板派生类的值
- 从 C++ 数组元素的指针获取索引的最快方法是什么
- 通过指针获取最大数量的元素
- 如何使用指针获取字符串数据
- 返回指向指针数组的指针获取下一个元素失败
- 从"子项"项指针获取"父""std::tuple"
- 从成员函数指针获取方法的返回类型
- 如何从指向数组的指针获取对该数组的引用