Vorlage basierend auf Laufzeitzeichenfolge in C ++ auswählen
Ich habe einen Attributvektor, der verschiedene Typen enthalten kann:
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 der Laufzeiteingabe für den Typ möchte ich die entsprechende Datenstruktur erstellen. Pseudocode:
std::string type("int");
raw_attribute_vector<type> foo;
ffensichtlich schlägt dies fehl. Eine einfache, aber hässliche und nicht zu wartende Problemumgehung ist eine Laufzeitumschaltung / verkettet, wenn:
base_attribute_vector *foo;
if(type == "int") foo = new raw_attribute_vector<int>;
else if(type == "string") ...
Ich habe über Laufzeit-Polymorphismen mit Funktoren gelesen, fand sie jedoch für eine konzeptionell einfache Aufgabe recht komplex.
Was ist der beste und sauberste Weg, um diese Arbeit zu machen? Ich habe mit @ rumgespieboost::hana
, wobei festgestellt wird, dass ich zwar eine Zuordnung von Zeichenfolge zu Typ erstellen kann, die Suche jedoch nur zur Kompilierungszeit durchgeführt werden kann:
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 Typen sind zur Kompilierungszeit bekannt. Vorschläge werden sehr geschätzt. In einer perfekten Lösung würde ich die Zuordnung von Name-> Typ an einer einzigen Stelle erstellen. Danach würde ich es so benutzen
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 Kompilierungszeit ausgeführt wird. Mein Ziel ist es, so gut lesbaren Code wie möglich zu haben.