2009-10-14 29 views
1

我需要編寫一個類,它接收具有任何「基本」類型的任意數量元素的集合。我也需要能夠知道每個成員的類型(或者至少是類型的大小)。 該類的目的是序列化元素以將它們存儲在固定長度寄存器的文件中。C++中的多態性集合

這是可行嗎?

我知道C++是靜態類型的,並且沒有關於繼承的共同父項(例如Java中的Object)。所以,我不能接收數組或矢量,因爲所有元素都應該具有相同的類型。

我也想到了一個指針數組,但這樣我就不知道元素類型或其大小。

任何想法?

PS:找不到類似的問題,但如果存在,請redirectme。

+0

您可以創建自己的純虛擬基元類型,該類型具有一個函數,該函數需要實現聲明它是什麼類型的類。可能來自一個枚舉。然後,您可以根據枚舉返回的內容將其轉換爲正確的類型,但這似乎是一種骯髒的方式。 (可能有更好的方法) – 2009-10-14 04:33:39

+0

這已經在Boost.Any中實現了,正如Jim所指出的那樣。 – GManNickG 2009-10-14 04:52:33

回答

4

你看過boost::any?這聽起來可能與你的問題很好地匹配:存儲對象的多態集合,而不會丟失與數組void *或類似黑客相關的類型信息。

1

您可以使用模板類(或模板函數)做到這一點:


如果你的意思是更復雜的問題,其Shhnap在評論解釋,那麼也許是這樣的:

class ISerializable 
{ 
public: 
    size_t getSize() const = 0; 
    const void* getBytes() const = 0; 
}; 

template<class T> 
class SerializableT : public ISerializable 
{ 
public: 
    size_t getSize() const { return sizeof(T); } 
    const void* getBytes() const = { return &m_data; } 
    SerializableT(T data) : m_data(data) {} 
private: 
    T m_data; 
}; 

typedef vector< smartptr<ISerializable> > Serializable; 

void serialize(const Serializable& serializable) 
{ 
    for(Serializable::const_iterator it = serializable.begin(), end = serializable.end(); it != end; ++it) 
    { 
    const smartptr<ISerializable>& element = *it; 
    size_t size = it->getSize(); 
    const void* bytes = it->getBytes(); 
    save(bytes, size); //to be implemented 
    } 
} 
+0

他不想遍歷一個相同類型T的數組,而是不同類型的數組,然後他可以隨意將其轉換回正確的類型。否則,他可以使用std :: Vector,而不是創建自己的(可能較慢)模板類。 – 2009-10-14 04:40:10