2013-04-12 22 views
0

我有一些對應於某些數據類型的類,它們應該對實際數據進行編碼和解碼。例如,將具有用於編碼整數值並且從編碼字節流對其進行解碼的功能。 所有這些類都來自基類MyTypes。在解碼時,在從編碼的 字符串獲取值之後,我將該值放入相應的數據類型中,例如int(在MyInt的情況下),並將數據作爲void *返回。使用運行時類型標識從void指針獲取數據

在 接收端,我將指針指向(int *),然後將其解引用到結果中。

但現在我需要一個具有數組的類型。在數組的情況下,我正在使用模板來說明數組將要持有的數組是 。也就是說,

template<typename T> 
class MyArray:public MyType 
{ 
    vector<T *> mydata; 
    .... 
}; 

在解碼功能,我會調用類型T的譯碼,但現在它只是返回void*。我的陣列將不知道 解碼類型將是什麼。所以我不能改寫void *並將其解引用以獲得價值。也就是說, 如果我採取的MyInt

MyArray<MyInt> data; 

陣列「data」的數組不會知道它的解碼結果將是一個vector<int>。並且最好將數據傳遞爲vector<int>而不是vector<int*> 我該如何實現它?

回答

3

確保可以作爲模板參數(MyInt等),每種類型都有一個typedef具有給定名稱,如RepresentedType

class MyInt : public MyType { 
public: 
    typedef int RepresentedType; 
    .... 
}; 

現在你可以在模板類使用它:

template<typename T> 
class MyArray : public MyType { 
    .... 
    T::RepresentedType * something(); 
}; 

(我希望這是你想要的。)

1

你可以使用boost ::任何類你的目的。這是根據運行時類型標識獲取任何 存儲數據值的簡單而有效的方法。

vector<boost::any> somevec; 
boost::any obj= new MyClass<SomeTemplate>; 
somevec.push_back(obj); 

SomeTemplate ret = boost::any_cast<SomeTemplate>(somevec[0]);