【发布时间】:2017-08-15 19:36:17
【问题描述】:
在以下代码中:
using Previous = std::atomic<void*>;
template<class T>
struct Element{
Previous previous;
T value;
}
我是否可以进行指针运算以从 T* 获取 Element<T>* ?
像这样:
template<class T>
Element<T>* getElement(T* value){
return static_cast<Element<T>*>(static_cast<void*>(reinterpret_cast<unsigned char *>(value) - sizeof(Previous)));
}
其中T 可能是非标准布局。
附:我清楚地看到我不能为此使用offsetof。但是,可能对于这种特殊情况,指针运算会起作用吗?
【问题讨论】:
-
我建议减少黑客攻击并更多地修复设计。
-
只有当结果是指向属于同一数组或该数组末尾的元素的指针时,才允许进行指针运算。 (
&x的行为类似于单元素数组。)其他所有内容都未定义。 -
我真正想要的是
template <typename Object, typename Member> Object* operator-(Member* member, Member Object::* ptr),这样您就可以从指向成员的指针中减去指向成员的指针以获得指向包含对象的指针。
标签: c++