Выберите шаблон на основе строки времени выполнения в 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;

Основываясь на входных данных для типа, я хотел бы создать соответствующую структуру данных. псевдокод:

std::string type("int");
raw_attribute_vector<type> foo;

Очевидно, это не удается. Простой, но уродливый и необоснованный обходной путь - это переключатель времени выполнения / цепочка, если:

base_attribute_vector *foo;
if(type == "int") foo = new raw_attribute_vector<int>;
else if(type == "string") ...

Я читал о полиморфизме во время выполнения с функторами, но нашел его довольно сложным для задачи, которая концептуально проста.

Какой самый лучший и чистый способ сделать эту работу? Я играл сboost::hanaОбнаружив, что, хотя я могу создать отображение из строки в тип, поиск может быть выполнен только во время компиляции:

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>)
);

Все возможные типы известны во время компиляции. Любые предложения высоко ценятся. В идеальном решении, я бы создал отображение name-> type в одном месте. После этого я бы использовал это так

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();

Не требуется, чтобы это волшебство происходило во время компиляции. Моя цель - создать максимально читаемый код.

Ответы на вопрос(6)

Ваш ответ на вопрос