ich einen Merkmalsvektor haben, die verschiedene Arten halten kann:Vorlage Wählen Sie basierend auf Laufzeit Zeichenfolge in C++
class base_attribute_vector; // no template args
template<typename T>
class raw_attribute_vector : public base_attribute_vector;
raw_attribute_vector<int> foo;
raw_attribute_vector<std::string> foo;
Basierend auf Laufzeit-Eingabe für die Art, würde Ich mag die geeignete Datenstruktur erstellen . Pseudocode:
std::string type("int");
raw_attribute_vector<type> foo;
Offensichtlich schlägt dies fehl. Eine einfache, aber hässlich und wartbaren Abhilfe ist ein Laufzeitschalter/angekettet, wenn:
base_attribute_vector *foo;
if(type == "int") foo = new raw_attribute_vector<int>;
else if(type == "string") ...
ich mit functors Lesen Sie mehr über Polymorphismus-Zeit laufen, aber fand es ziemlich komplex für eine Aufgabe, die vom Konzept her einfach ist.
Was ist der beste und sauberste Weg, um dies zu erreichen? Ich spielte mit boost::hana
herum, festgestellt, dass, während ich eine Abbildung von String erstellen kann eingeben, kann die Suche nur bei der Kompilierung durchgeführt werden:
auto types =
hana::make_map(
hana::make_pair(BOOST_HANA_STRING("int"), hana::type_c<int>),
hana::make_pair(BOOST_HANA_STRING("string"), hana::type_c<std::string>)
);
Alle möglichen Arten sind bekannt. Irgendwelche Vorschläge werden sehr geschätzt. In einer perfekten Lösung würde ich das Namens-> Typ-Mapping an einem einzigen Ort erstellen. Danach würde ich es so verwenden
std::vector<base_attribute_vector*> foo;
foo.push_back(magic::make_templated<raw_attribute_vector, "int">);
foo.push_back(magic::make_templated<raw_attribute_vector, "std::string">);
foo[0]->insert(123);
foo[1]->insert("bla");
foo[0]->print();
foo[1]->print();
Es ist nicht erforderlich, dass diese Magie zur Kompilierzeit passiert. Mein Ziel ist es, möglichst lesbaren Code zu haben.
Vielleicht bin ich etwas fehlt, aber jede Vorlage Instanziierung geschieht per Definition bei compiletime, also bin ich mir nicht sicher, was du erwartest. Sie können natürlich alle Vorlagen von einer gemeinsamen Basisklasse erben lassen und dann den Laufzeitpolymorphismus verwenden, aber der Bereich der instanziierten Vorlagen wird noch bei Kompilierungszeit definiert. – MikeMB
Nehmen wir an, wir haben es gelöst und Sie können zur Laufzeit die entsprechende Datenstruktur erstellen. Können Sie uns ein Beispiel zeigen, wie Sie es verwenden werden? Die Chancen stehen gut, dass Sie das genannte Problem lösen können, wenn Sie dieses Beispiel konstruieren können. – Leon
@MikeMB Ja, das ist die Idee. Ich habe die Frage bearbeitet, um sie hoffentlich etwas klarer zu machen. – mrks