2009-01-05 151 views
1

我一直在學習C++,來自C#,我已經習慣了使用服務提供者:基本上是一個字典<類型,對象>。不幸的是,我無法弄清楚如何在C++中執行此操作。所以,這些問題基本上都是:C++服務提供商

  1. 我將如何讓C++中的字典。

  2. 我如何使用'Type'與它,據我所知在C++中沒有'Type'。

  3. 與上面相同,但帶有'對象'。

謝謝!

回答

5

我假設你正試圖將一個類型映射到單個對象實例。你可以嘗試的東西沿着這些路線:

#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方法來比較它們。

0

字典聽起來像一個STL地圖給我:std::map<K, T>。看一下標準模板庫 - 它很棒。它一直是ANSI C++的一部分。如果我沒有記錯的話,微軟在PJ Plauger上有很好的實現。

+0

模板註釋未通過;應該讀std:map duffymo 2009-01-05 02:52:04

+0

使用`std :: map `而不是 – 2009-01-05 02:52:54

3

你可能想看看STL map template。 C++肯定有類型(如果沒有它,很難繼承),只是沒有具體定義的「Type」類。

2

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 == Kstd::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()工作。