![](/img/trans.png)
[英]Using pointer to inner class object as outer class constructor argument in C++
[英]Get outer object pointer inside inner object
有兩個對象: Holder
和Property
。 Holder
包含Property
作為字段。 我想從Property
訪問Holder
。 在一般情況下, Property
的地址將是Holder
的地址 + Property
類型字段的偏移量。
但重要的是: Property
不應該有任何字段(例如,我不能將Holder
傳遞給Property
的構造函數並將其保存為“外部”)。
UPD:我想這個技巧只適用於標准布局。
UPD2:我想使用這種方法(不傳遞對Property
的引用)的主要原因是在Holder
對象中使用盡可能少的內存。 在最好的情況下: sizeof(Property)
為 0 字節(盡管標准不允許這樣做)。
首先,我嘗試做的是將指向成員的指針傳遞給模板參數:
Property<&Holder::prop> prop;
要么
Property<offsetof(Holder, prop)> prop;
但是prop
還沒有定義(這是錯誤的)。
完整的偽代碼如下所示:
template<size_t FieldOffset>
class Property
{
class Holder* GetOuter()
{
return (char*)this - FieldOffset; // go to Outer object via offset of our field
}
}
class Holder
{
int Field1;
std::string Field2;
Property<offsetof(Holder, prop)> prop; // Error!
}
還有其他建議可以做類似的事情嗎?
只有當類是標准布局且成員是第一個成員時,C++ 中的內存模型才允許從成員子對象導航到它的包含(類類型)對象。 這個想法是,編譯器可以推斷哪些指針必須轉義才能進行寫入,從而需要從內存中重新加載一些其他值。 因此,幾乎在所有情況下你想要的都是不可能的,盡管有人提議放寬該規則以添加類似這樣的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.