Eine ID erzeugen
-
Hallo,
ich möchte aus eingen meiner Datenmodell-Objekte "Properties" "exportieren", also solchermaßen, dass man sie zum Beispiel in einem Propertygrid anzeigen kann, bzw. auch serialisieren/deserialisieren kann und ähnliches.
Jetzt hat jedes Objekt im allgemeinen relativ viele Properties. Da GUI involviert ist, kann man davon ausgehen, dass es gleichzeitig verschiedene abhängige Visualisierungen geben kann. Also wäre es angebracht, eine Art "Observer"-System zu haben, sodass Änderungen an Properties propagiert werden können, um alle Views up-to-date zu halten.
Ein Property ist extern eine Interface-Klasse mit Setter und Getter etc, ausgeführt als Proxy-Objekt, das beispielsweise an freie oder Memberfunktionen weiterleitet.
Jetzt möchte ich explizit nicht in allen Objekten gleichzeitig eine Liste aller Properties zwischenspeichern, von denen jedes wiederum eine Liste von Observern etc., weil in einem realistischen Szenario nur einige ausgewählte Objekte gleichzeitig Property-Referenzen "draußen" haben, es durchaus aber sehr viele Objekte geben kann.
Daher besitzen die Objekte über eine Basisklasse eben einen Aufruf, der die Property-Auflistung zur Laufzeit bewerkstelligt (Nennen wir es "EnumerateProperties"):class Test { void EnumerateProperties( std::function< void( PropertyPtr ) > functor, property_token token ) { if( !token ) { functor( make_property( "some_readable_id", &Test::Getter, ... ) ); auto ptr = make_property( ... ); ptr.add( make_property( ... ) ); functor( std::move( ptr ) ); functor( make_property( token_, ... ) ); } } property_token token_; };Nun müssten diese Objekte aber für jedes Property irgendwie selber eine Referenz halten, damit bei mehrmaliger Herausgabe von Referenzen über EnumerateProperties die Observer-Information "gelinked" ist. Das würde ich gerne über "make_property" erleichtern, weil die Objekte nur für ausgewählte Properties selber eine Referenz auf den Link benötigen (falls es innere Querabhängigkeiten von Properties gibt, dies wird oben über den "token_" member dargestellt). Das heißt, ich muss den generierten Property-Proxies in den meisten Fällen eine ID zuweisen, sodass wenn später ein Proxy zum selben Property erzeugt wird, ein vorhandener Link aufgefunden werden kann.
Jetzt kommt das Problem:
Die Properties bieten nach außen eine Hierarchie, das heißt, auch wenn ich einzigartige ids habe, so müsste ich zum Auffinden erst einen Text-Pfad zusammenstückeln und könnte das dann zu einer id hashen oder ähnliches.Andererseits erscheint es logisch, dass jedes Property zumindest einen Getter besitzt, den ich eigentlich als ID verwenden könnte, weil Funktionszeiger ja wahrscheinlich einzigartig sind und das Property identifizieren.
Aber! Methodenzeiger sind keine normalen Zeiger, die man einfach in einen uintptr_t casten könnte, weil ja Implementierungsabhängig ist, wie sie umgesetzt werden. Fällt euch bei gegebener Information ein Trick ein, wie man eine reproduzierbare Property-spezifische ID erzeugen könnte, die make_property im hintergrund verwalten könnte, ohne dass sich der user-code ids aus den Fingern saugen muss?
make_property ist ja nur eine Hilfsfunktion, das heißt das kann auch gerne etwas unklar aussehen, es ist ja nichts, das in irgendeiner externen Schnittstelle ist. Hauptsache es handelt sich um korrekten code und ich kann irgendwie die String-Vergleiche sparen.Oder ein anderes Schema, wie man observierbare Proxies umsetzen könnte?