C ++中的Polymorph集合

时间:2009-10-14 04:29:24

标签: c++

我需要编写一个类,它接收具有任何“原始”类型的任意数量元素的集合。我还需要能够知道每个成员的类型(或至少是类型的大小)。 此类的目的是序列化元素以将它们存储在固定长度寄存器中的文件中。

这是可能的吗?

我知道C ++是静态类型的,并且没有关于继承的公共父级(例如Java中的Object)。所以,我无法接收数组或向量,因为所有元素应该具有相同的类型。

我还想到了一个指针数组,但是这样我就不知道元素类型或它的大小了。

有什么想法吗?

PS:找不到类似的问题,但如果存在,请重定向。

3 个答案:

答案 0 :(得分:4)

你有没有看过boost::any?听起来它可能是您的问题的一个很好的匹配:存储多态的对象集合,而不会丢失void *或类似hacks数组中出现的类型信息。

答案 1 :(得分:1)

您可以使用模板类(或模板函数)执行此操作:

template<class T>
class MyClassT
{
  void receive(const T* array, size_t n)
  {
    size_t sizeOfT = sizeof(T);
    ... code here to serialize the array ...
  }
};

如果你的意思是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
  }
}

答案 2 :(得分:0)

如果你对提升感兴趣,可以使用像Jim stated这样的Boost.Any,或者一直使用他们的serialization library