Ich bin von Koordinatendaten mit viel zu tun, denken vordefinierte BibliothekstypenWie kann ich Objekte umbrechen, so dass sie separate Typen sind, die nicht interagieren können?
struct Point3d { double x,y,z; };
und dergleichen von Eigen und OpenCV.
Nun werden die Koordinaten jedes Punktes in einem Bezugssystem ausgedrückt. Ich möchte, dass das Typsystem den Rahmen verfolgt, in dem jeder Punkt ausgedrückt wird. Etwas nach dem Vorbild von
enum Frames { frame1, frame2 };
using Point_1 = TagWrapper<Point3d, frame1>;
using Point_2 = TagWrapper<Point3d, frame2>;
Point3d untagged_pt = ...;
Point_1 pt1 = ...;
Point_2 pt2 = ...;
Transform<frame1, frame2> tf_1_to_2 = ...; // from frame1 to frame2
// Compile time error, pt1 and pt2 are in different frames
auto pt3 = pt1 + pt2;
// Ok!, and typeof(pt4) == Point_2
auto pt4 = (tf_1_to_2 * pt1) + pt2;
// Compile time error, pt2 is not in frame1
auto pt5 = tf_1_to_2 * pt2;
// Ok!, and typeof(pt5) == Point_1
auto pt5 = untagged_pt + pt1;
Vorzugsweise könnte ich jede Art mit jedem „Tag“ wickeln, damit es einen markierter Typ. Dann verhalten sich alle ähnlich gekennzeichneten Typen wie ihre unmarkierten Typen, wenn sie miteinander verwendet werden, aber das Mischen von Objekten mit verschiedenen Tags sollte ein Kompilierzeitfehler sein. Ich nehme an, dass es auch Sinn macht, dass das Ergebnis von Operationen zwischen einem unmarkierten und einem markierten Typ markiert wird.
Dies ist ähnlich wie Einheiten, aber ich möchte alles in mehrere Arten von sich gegenseitig ausschließenden "Einheiten" verwandeln. So ein TagWrapper<Person, type1>
hat die Schnittstelle von Person
, wird aber nicht mit einem TagWrapper<Person, type2>
interagieren, zum Beispiel.
Diese ist ein bisschen unklar. Es scheint mir, als ob du nach einer Unit-Bibliothek suchst, wo du '1m + 1m = 2m' haben könntest, aber' 1m + 1N' ist ein Kompilierungsfehler. Außer es scheint, dass Sie es einschränken möchten, so dass es genau die gleiche "Einheit" sein muss, so konnten Sie etwas wie 1m/1s = 1 m/s nicht tun – Justin
Einheiten ist eine gute Möglichkeit, darüber nachzudenken, aber ich möchte alles in mehrere Arten von sich gegenseitig ausschließenden "Einheiten" verwandeln. Also hat ein 'TagWrapper' die Schnittstelle von 'Person', interagiert aber nicht mit einem' TagWrapper 'zum Beispiel. –
daemacles
Sie können die Schnittstelle von "Person" nicht vollständig replizieren. Sie müssen manuell die Schnittstellen ausschreiben, die Sie unterstützen möchten (arithmetische Operatoren usw.). Was Sie darüber hinaus tun können, ist das Hinzufügen einer 'get()' -Memberfunktion, die den zugrunde liegenden Typ erhält. In ein bisschen, komme ich hier zurück und beantworte deine Frage – Justin