假设我有这个设置:
struct XView;
struct X
{
...
XView view;
};
Type XView
仅用于这一字段;它也是内部的,因此禁止从外部实例化它,即禁止将它用于任何其他用途。
因此,假设XView
类型的任何 对象是一个X::view
字段,是否有可能找到 的地址X
来自 XView
的地址,完全符合 C++ 标准定义的行为并且没有类型双关? IE。是否有可能做这样的事情:
void XView::some_function ()
{
X& this_x = some_computations_involving (this);
}
我当然可以存储一个指针,所以这将变得像 x = *this->parent_x
一样微不足道,但如果可能的话我希望没有指针。
编辑:请注意,我需要一个不涉及类型双关的答案,否则我宁愿使用“只存储一个指针”的解决方案。
最佳答案
第一种方法是让 XView
成为 X
的第一个成员,然后你可以这样做:
void XView::some_function ()
{
X & this_x = reinterpret_cast<X&>(*this);
}
第二种方法是在 XView
不是 X
的第一个成员时使用偏移量。
从技术上讲,如果不涉及虚拟性,这两种方法是相同的,只是第一种方法是第二种方法的特殊情况(即当偏移量 = 0 时),这是一般情况。
至于编辑,我认为不强制转换是不可能的。您必须将指针存储在 XView
中,或者维护指针的映射(或其他一些数据结构)。
关于C++:字段对象可以在不存储指针的情况下知道它的 "parent"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453809/