ich eine Baumhierarchie von Typen, die jeweils durch Zeichenfolge definiert, so etwas wie folgt aus:Typ Hierarchie basierend auf Zeichenfolge, mit der Kompilierung Typprüfung
com
com.example
com.example.shape
com.example.shape.triangle
com.example.shape.triangle.equilateral
com.example.shape.triangle.isosceles
com.example.shape.triangle.right
com.example.shape.quadrilateral
com.example.shape.quadrilateral.rectangle
com.example.shape.quadrilateral.squere
Typen einige Daten mit dynamischen Parametern definiert, dass in geändert werden Runtime, so dass es keine Möglichkeit gibt, eine Typhierarchie für die Kompilierzeit zu erstellen. Jede Entität ist also nur ein Typname (String) und eine Liste von Parametern, und Sie können immer einen neuen Typ im System registrieren. Trotzdem sind viele Typen vordefiniert und können beim Systemstart registriert werden. Um die gleiche Erfahrung mit Daten zu haben, die zur Laufzeit erstellt und vordefiniert wurden, verwende ich diese dynamische Darstellung für beide. Für vordefinierte Typen hätte ich gern einen Mechanismus, der den Typnamen zur Kompilierzeit validieren kann und ich möchte Zeichenfolgen nicht jedes Mal direkt in den Code einfügen, wenn er verwendet werden muss. Es kann durch die Definition von string const-Ausdrücken gelöst werden ist nicht sehr nett, etwas wie das:
string some_type = "com.example.type1";
...
registerType(some_type, parameters_definition);
So denke ich an einen besseren Weg.
Ein weiterer Ansatz ist, so etwas zu machen:
#include <iostream>
#include <string>
struct Base {
Base(std::string parent_name, std::string my_name) : name_(parent_name + "." + my_name) {}
std::string name_;
};
std::ostream& operator<< (std::ostream& os, const Base& base) {
os << base.name_;
return os;
}
struct G : Base {
G(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
};
struct F : Base {
F(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
G rectangle{name_, "rectangle"};
G squere{name_, "squere"};
};
struct E : Base {
E(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
};
struct D : Base{
D(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
E equilateral{name_, "equilateral"};
E isosceles{name_, "isosceles"};
E right{name_, "right"};
};
struct C : Base {
C(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
D triangle{name_, "triangle"};
F quadrilateral{name_, "quadrilateral"};
};
struct B : Base{
B(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
C shape{name_, "shape"};
};
struct A {
A(std::string my_name) : name_(my_name) {};
std::string name_;
B example{name_, "example"};
};
std::ostream& operator<< (std::ostream& os, const A& a) {
os << a.name_;
return os;
}
int main() {
A com("com");
std::cout << com << std::endl;
std::cout << com.example << std::endl;
std::cout << com.example.shape << std::endl;
std::cout << com.example.shape.triangle << std::endl;
std::cout << com.example.shape.triangle.equilateral << std::endl;
std::cout << com.example.shape.triangle.isosceles << std::endl;
std::cout << com.example.shape.triangle.right << std::endl;
std::cout << com.example.shape.quadrilateral << std::endl;
std::cout << com.example.shape.quadrilateral.rectangle << std::endl;
std::cout << com.example.shape.quadrilateral.squere << std::endl;
return 0;
}
Es ist schön, zu verwenden, insbesondere IDE mit mit Code-Hinweisen, aber leider nicht einfach zu definieren. Jede andere Baum-Ebene erfordert, dass eine neue Klasse mit neuen Mitgliedern definiert wird, dieser Name entspricht einigen Zeichenfolgen.
Ich bin auf der Suche nach einer besseren Lösung - einfacher. Es wäre toll, wenn es wie eine Art Template-Spezialisierung definiert wäre, aber ich weiß nicht, wie ich es machen soll.
Alle Vorschläge willkommen :) Grüße, Piciu.
Ich nehme an, dies ist nicht nur eine komplizierte Art, Zeichenfolgen zu drucken. Wozu dient diese Namenshierarchie eigentlich? Es würde helfen, das zugrundeliegende Problem besser zu verstehen, anstatt nur Ihren Versuch an einem ganz bestimmten Teil der Lösung zu sehen, wie Sie es sehen – Smeeheey