Listing 3: Two template classes for vectors of fixed or variable length

// N is the size of the array
// shift operators for NetBuffer and T must be defined

template <class T, size_t N>
class NetArray : public NetObject
{
  T data[N];
protected:
  virtual void netWrite (NetBuffer &nb) const
    {  for(int i=0; i<N; ++i) nb << data[i];  }

  virtual void netRead  (NetBuffer &nb)
    { for(int i=0; i<N; ++i) nb >> data[i]; }

public:
  operator       T*()       { return data; }
  operator const T*() const { return data; }

  NetArray () { netClear(); }
};


// T must inherit from NetObject
// C is the type of the counter
template <class T, class C=unsigned char>
class NetVector :
  public NetObject,
  public std::vector<T>
{
protected:
  virtual void netWrite (NetBuffer &nb) const
  {
    C counter = size();

    nb << counter;

    const_iterator it = begin();

    for(; it != end() ; ++it )
     nb << (*it);
  }

  virtual void netRead  (NetBuffer &nb)
  {
    C counter;
    T item;

    clear();

    nb >> counter;

    for(int i=0; i<counter; ++i)
    {
      nb >> item ;
      push_back(item);
    }
   }

public:

  explicit NetVector (size_t n=0) : std::vector<T>(n) {}
};
— End of Listing —