如果我正確理解你的問題,如果你的「數據庫」中有30個結構(表),你想要找到所有具有「empid」作爲列的結構(即結構的成員)?在C++中,我沒有意識到一種機制來測試一個結構是否有名稱的特定成員,至少不是在運行時提供的名稱。您需要以某種形式的「元數據」 - 例如具有字符串鍵地圖,列出了一組例如結構(或在邏輯與字符串比較等編碼的)...
這裏是一個草圖...
A「表」級上鍵入行類型(即結構)
class table
{
// some virtual methods common to all classes..
};
template <typename _Row>
class data_table : public table
{
// methods
// real data
std::vector<_Row> data;
};
,那麼你需要一個數據庫類來保存所有的表..
class database
{
// methods
std::map<int, boost::shared_ptr<table> > tables; // here int is for a unique id for table
};
現在你有表,每張表是一組爲r的集合行(結構)。然後,您需要定義一些元數據數據庫,即圖列表等等。
std::multimap<std::string, boost::shared_ptr<table> > columns;
這您在使用該結構的知識來填充,例如,該地圖可以包含,你的代碼上方:
columns["empid"] = id of table<emp>;
columns["empid"] = id of table<payroll>;
等
現在,您可以將「查詢」傳遞給您的「數據庫」類,在那裏您會說類似「empid」= 1的內容,然後在列映射中查找並查找表的所有實例,然後分別您可以使用「empid」= 1進行查詢。至於如何將「empid」映射到emp
結構中的真實empid
字段,則必須將該邏輯嵌入emp
結構中可以委託給table<emp>
的方法中(或者如果您能想到的存儲成員引用的一個聰明的辦法...)
這只是一個建議...
或者,考慮使用的M中任何可以支持真正查詢的數據庫,並以獨立或嵌入的方式運行!
編輯:
struct emp
{
int empid;
string empname;
template <typename T>
bool matches(const string& field_name, const T& value)
{
if (field_name == "empid")
return empid == value;
else if (field_name == "empname")
return empname == value;
// etc
return false;
}
};
因此,「元數據」在測試的邏輯進行編碼,你傳遞一個字符串字段名稱,然後根據它是什麼,你比較合適的值...這不是很有效率,但它的作品...
來源
2010-10-21 10:31:43
Nim
ohh ..昨天你也給我答案。是的,我爲結構實例創建了矢量。但find_if只給我第一個實例,還有一件事=>如果輸入是:salary = 9000,那麼它應該給我a1,a3(首先檢查成員名稱,接下來如果成員名稱存在 - 則值)。你能爲此寫一個示例代碼嗎? – jony 2010-10-21 10:10:38