我有一个可以容纳不同类型的属性向量:
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>)
);
所有可能的类型在编译时都是已知的。任何建议都受到高度赞赏。在一个完美的解决方案中,我会在一个地方创建名称-> 类型映射。之后,我会这样使用它
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();
这种魔法不需要在编译时发生。我的目标是拥有尽可能易读的代码。