Выберите шаблон на основе строки времени выполнения в 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();
Не требуется, чтобы это волшебство происходило во время компиляции. Моя цель - создать максимально читаемый код.