具有不同类型的多个向量

时间:2015-11-02 04:34:49

标签: c++ vector

我正在尝试创建一个使用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...
}

对于我希望能存储的每种类型?
我觉得必须有更好的方法来做到这一点。

1 个答案:

答案 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 :-(");
}