2015-11-02 70 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 :-("); 
}