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.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage