我一直在學習C++,來自C#,我已經習慣了使用服務提供者:基本上是一個字典<類型,對象>。不幸的是,我無法弄清楚如何在C++中執行此操作。所以,這些問題基本上都是:C++服務提供商
我將如何讓C++中的字典。
我如何使用'Type'與它,據我所知在C++中沒有'Type'。
與上面相同,但帶有'對象'。
謝謝!
我一直在學習C++,來自C#,我已經習慣了使用服務提供者:基本上是一個字典<類型,對象>。不幸的是,我無法弄清楚如何在C++中執行此操作。所以,這些問題基本上都是:C++服務提供商
我將如何讓C++中的字典。
我如何使用'Type'與它,據我所知在C++中沒有'Type'。
與上面相同,但帶有'對象'。
謝謝!
我假設你正試圖將一個類型映射到單個對象實例。你可以嘗試的東西沿着這些路線:
#include <typeinfo>
#include <map>
#include <string>
using namespace std;
class SomeClass
{
public:
virtual ~SomeClass() {} // virtual function to get a v-table
};
struct type_info_less
{
bool operator() (const std::type_info* lhs, const std::type_info* rhs) const
{
return lhs->before(*rhs) != 0;
}
};
class TypeMap
{
typedef map <type_info *, void *, type_info_less> TypenameToObject;
TypenameToObject ObjectMap;
public:
template <typename T>
T *Get() const
{
TypenameToObject::const_iterator iType = ObjectMap.find(&typeid(T));
if (iType == ObjectMap.end())
return NULL;
return reinterpret_cast<T *>(iType->second);
}
template <typename T>
void Set(T *value)
{
ObjectMap[&typeid(T)] = reinterpret_cast<void *>(value);
}
};
int main()
{
TypeMap Services;
Services.Set<SomeClass>(new SomeClass());
SomeClass *x = Services.Get<SomeClass>();
}
在C++類型不是在自己的權利的第一類對象,但至少類型名稱將是唯一的,所以您可以通過這把鑰匙。
編輯:名稱實際上並不保證是唯一的,所以請堅持type_info指針並使用before方法來比較它們。
字典聽起來像一個STL地圖給我:std::map<K, T>
。看一下標準模板庫 - 它很棒。它一直是ANSI C++的一部分。如果我沒有記錯的話,微軟在PJ Plauger上有很好的實現。
你可能想看看STL map template。 C++肯定有類型(如果沒有它,很難繼承),只是沒有具體定義的「Type」類。
STL有兩個關聯容器:std::map<K,V> and
std :: multimap。還有std::set<V>
,它應該是std::map<V,void>
的適配器,但正因爲如此,它不是關聯容器。 multimap與地圖類似,只允許在同一個容器中使用多個相同的鍵。 map和multimap都包含std::pair<K,V>
類型的元素。換句話說,std::map<K,V>::value_type == std::pair<K,V>
,但是std::map<K,V>::key_type == K
和std::map<K,V>::mapped_type == V
。
至於「類型」,我不完全確定你的意思。如果你的意思是參數化的類,那麼C++就會調用這個「模板編程」或者「泛型編程」。在上面,std::map<K,V>
是通過K和V對鍵的類型和值的類型進行參數化的。 C++還支持模板函數:
template<typename T>
void f(T o);
將聲明一個函數,它根本不包含任何類型的參數,包括基本類型。 C++不支持泛型類型解析,因此類型T必須具有某種層次結構。現在,你所能做的只是假設傳入的類型確實是正確的層次結構,並且如果你試圖在該類型的對象上調用一個非聲明函數,編譯器就會抱怨。
template<typename T>
void f(T o) {
o.do_it();
}
上面將只要T定義的方法do_it()
工作。
模板註釋未通過;應該讀std:map –
duffymo
2009-01-05 02:52:04
使用`std :: map`而不是 –
2009-01-05 02:52:54