您可以使用模板來做到這一點。
編輯:基於額外信息的新實現。如果mymap
是std::map<int, Shape*>
:
template <typename T>
void lookup(int idNum, T* &ptr) {
auto it = mymap.find(idNum);
if (it == mymap.end()) {
ptr = 0;
} else {
ptr = dynamic_cast<T*>(*it); // Shape must have a virtual member function
}
}
或者你可能更喜歡:
template <typename T>
T* lookup(int idNum) {
auto it = mymap.find(idNum);
if (it == mymap.end()) {
return 0;
}
return dynamic_cast<T*>(*it);
}
然後調用它像Circle *circle = database.lookup<Circle>(123);
顯然多態性容器的樂趣本身就是一個一大堆,但我會假設你已經排序。那裏可能有一個shared_ptr
,我已經遺漏了。
舊的實現時,我想到了DB可以存儲POD的副本:
template <typename T>
void lookup(int idNum, T* &ptr) {
void *theresult = // something based on idNum
// some check needed here that theresult really is the right type.
// how you do this depends on the database, but suppose that
// the database gives us some integer "type" which indicates the type
if (type != type_constant<T>::value) {
ptr = 0;
} else {
ptr = static_cast<T*>(theresult);
}
}
type_constant是 「型特徵」 的一個例子,你實現它想:
template <typename T>
struct type_constant {};
template <>
struct type_constant<Circle> {
static const int value = 1;
};
template <>
struct type_constant<Rectangle> {
static const int value = 2;
};
// etc...
IMO,這實際上是一個數據庫問題。你也不會說什麼數據庫。我會查看SQL關鍵字「LIKE」。 – JustBoo 2010-08-19 15:49:36
你打算如何將類型信息傳遞給數據庫? (或者我應該說,數據庫將如何接收它?) – 2010-08-19 15:50:19
如果您希望數據庫使用此信息*執行某些操作*,則必須編寫一些特定於圓的代碼,某些矩形特定的代碼等等令人厭惡。問題是*你想把這個代碼放在哪裏。你能告訴我們你想要數據庫做什麼嗎? – Beta 2010-08-19 15:51:50