具有不同类型的多个矢量

Multiple vectors with different types

本文关键字:同类型      更新时间:2023-10-16

我正在尝试创建一个小型的概念验证数据库系统,该系统使用表来存储数据。"表"是列的集合。每列可以有不同的类型。每个表可以有任意数量的列。

理想情况下,我想要这样的东西:

class Table {
  map<string, vector<T>> cols; //string is name of col, vector holds data
}

然而,向量的类型必须在编译时已知,所以我不能在同一个映射中有多个类型(向量int、向量double等)。

我需要吗:

class Table {
  map<string, vector<int>>    int_cols;
  map<string, vector<double>> double_cols;
  //etc...
}

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

实际上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 :-(");
}