2014-06-18 35 views
2

假設我想擁有一些向量,每個向量包含不同類型的對象, 是否有任何方法將指針映射到它們? 事情是這樣的:映射不同類型的向量指針

std::vector<class1> vec1; 
std::vector<class2> vec2; 
std::vector<class3> vec3; 

mapper.addVectorPtr(&vec1); 
mapper.addVectorPtr(&vec2); 
mapper.addVectorPtr(&vec3); 

std::vector<class1> * ptr1 = mapper.getVectorPtr<class1>; 
std::vector<class2> * ptr2 = mapper.getVectorPtr<class2>; 
std::vector<class3> * ptr3 = mapper.getVectorPtr<class3>; 

我大概可以使用自定義的類與向量指針作爲成員,這從一個共同的基類派生。然後,我將它們貶低爲所需的類並檢索指針,但我想查看是否有更好的選項。

+0

你知道在編譯時Class1的...... N級?或者你在尋找一個完全通用的解決方案? – quantdev

+0

@quantdev你能詳細說一下嗎?它應該適用於任何職業,如果這就是你的意思。 – Veritas

回答

2

您應該結帳http://www.cplusplus.com/reference/typeinfo/type_info/。你可以通過這種方式獲得typeinfo。允許您使用整數(=散列碼)作爲鍵創建映射。

那麼你可以實現你的mapclass如下(需要無參數的構造函數)

#include <vector> 
#include <typeinfo> 
#include <map> 
#include <iostream> 

class typemap{ 
    std::map<unsigned long, void*> m_ptrs; 
public: 
    template<typename A> 
    void addVectorPtr(std::vector<A>* b){ 
     A a; 
     m_ptrs[ typeid(a).hash_code() ] = b; 
    } 

    template<typename A> 
    std::vector<A>* getVectorPtr(){ 
     A a;//this is why you need the default constructor 
     return (std::vector<A>*) (m_ptrs[ typeid(a).hash_code() ]); 
    } 
}; 


int main(){ 
    std::vector<int>* t1 = new std::vector<int>(3,3); 
    typemap tm; 
    tm.addVectorPtr(t1); 

    std::vector<int> v=*(tm.getVectorPtr<int>()); 

    for(auto it = v.begin(); it!= v.end(); ++it){ 
     std::cout<<*it<<std::endl; 
    } 
} 
+0

我認爲這是我正在尋找的。我會使用type_index進行映射,但由於某些原因,從void *投射並沒有發生在我身上! – Veritas

+0

@Veritas我實際上正在嘗試它在這裏工作,但我似乎無法做到。這個例子肯定有很多錯誤 –

+0

可能有,我沒有檢查。這是我喜歡的方法。 – Veritas