我正在尝试创建一个使用Tables来存储数据的小型概念验证数据库系统。 “表”是列的集合。每列可以有不同的类型。每个表可以包含任意数量的列。
理想情况下,我喜欢这样的东西:
class Table {
map<string, vector<T>> cols; //string is name of col, vector holds data
}
但是,在编译时必须知道向量的类型,因此我不能在同一个映射中有多个类型(vector int,vector double等)。
我需要:
class Table {
map<string, vector<int>> int_cols;
map<string, vector<double>> double_cols;
//etc...
}
对于我希望能存储的每种类型?
我觉得必须有更好的方法来做到这一点。
答案 0 :(得分:0)
实际上,C ++不是管理动态类型的最佳选择。考虑这个向量的成员:
reference operator[](size_type index);
如果类型没有静态解析,返回值将如何在二进制级别下解释?对于缺乏元类信息支持的语言,对于这样的问题没有优雅的通用解决方案。但是,如果您要存储的值的类型是可枚举的,我建议您尝试使用boost :: any或boost :: variant:
map<std::string, boost::any> cols;
当你必须获取一个值时,它看起来真的很糟糕:
if (cols[key].type() == typeid(std::vector<int>)) {
process(cols[key].any_cast<std::vector<int>>());
} else if (cols[key].type() == typeid(std::vector<double>)) {
process(cols[key].any_cast<std::vector<double>>());
}
...
} else {
throw std::runtime_error("Oops! Seems that I missed a type :-(");
}