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.