Rückgriff von einem Member auf die "Hostklasse"
-
Guten (Morgen/Tag/Abend),
welche Möglichkeiten gibt es, von einem in einem benutzerdefinierten Typ abgelegten Member zurück auf die "Hostklasse" zuzugreifen? Das einzige, was mir dazu einfällt sind Unions:
union U; struct C { U& get() { return *reinterpret_cast<U*>(this); } }; union U { C c; };Das sollte funktionieren, solange C leer ist. Gibt es noch andere Möglichkeiten?
-
Erklär noch mal, was Du willst.
-
Tachyon schrieb:
Erklär noch mal, was Du willst.
+1. Erklär auch die Wörter "ablegen" und "Hostklasse".
-
template <typename T> class Host; template <typename T> class Member { Host<T>& myHost() { /* Wie soll das gehen? */ } // Mit den Daten arbeiten void foo() { myHost().x += 10; } }; // Die "Hostklasse" template <typename T> class Host { Member<T> m; int x; };
-
Am besten gar nicht, aber wenn es sein muss vllt. so:
template <typename T> class Host; template <typename T> class Member { Member(Host<T> & host) : m_host(host){} Host<T>& myHost() { return m_host; } // Mit den Daten arbeiten void foo() { myHost().x += 10; } Host<T> & m_host; }; // Die "Hostklasse" template <typename T> class Host { Member<T> m; Host() : m(*this){} int x; };
-
template <typename T> class Foo; template <typename T> class Bar { Foo<T>& myHost() { static Foo<T> foo; return foo; } public: void foo() { myHost().foo = 10; } }; template <typename T> class Foo { public: T foo; }; int main() { Bar<int> bar; bar.foo(); }So gemeint? Du kannst dir hier zu nutze machen, dass das Template erst instanziert wird, wenn es benutzt wird. Und dann ist deine "Hostklasse" schon bekannt. Daher reicht die Vorwärtsdeklaration oben aus.
-
Rückgriff schrieb:
Gibt es noch andere Möglichkeiten?
http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/
-
offsetof ist nur für POD-Typen definiert.
-
@Tachyon: Leider nimmt mir eine Referenz zu viel Speicher, aber an sich eine mögliche Lösung.
@SeppJ: Welches ist da die Hostklasse?
@volkard: Wenn du mir jetzt noch erklären kannst, wie ich dem Member klarmachen kann, welchen Offset er hat wäre das perfekt. Denn für offsetof muss das Member bereits definiert sein.