2015-11-02 71 views
2

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

理想情况下,我想是这样的:

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

但是,向量的类型在编译时是已知的,所以我不能有多种类型(矢量INT,矢量双,等)在相同的地图。

我需要:

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

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

+0

怎么样'Column'基类,有衍生'IntColumn','MarineMammalColumn'等,和'Table'含有'矢量'? – Beta

+0

你可以看看[Type Erasure](https://akrzemi1.wordpress.com/2013/11/18/type-erasure-part-i)吗? – iamOgunyinka

+0

也许像[this](http://ideone.com/CZyAl8) – iamOgunyinka

回答

0

实际上C++并不是管理动态类型的最佳选择。考虑载体的成员:

reference operator[](size_type index); 

如果类型不是静态解析,如何将返回值下二进制级别作何解释?对于缺乏元类信息支持的语言,对于这样的问题没有优雅的通用解决方案。但是,如果值要存储的类型是枚举的,我建议你去尝试的boost ::任何或升压::变种:

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