#include <iostream>

template<class T>
class InSeq {
public:
  virtual bool avail() = 0;
  virtual T next() = 0;
  virtual ~InSeq() { }
};

template<class T>
class ArraySeq: public InSeq<T> {
public:
  ArraySeq(const T* p0, int n0):
    p(p0), n(n0) { }
  virtual bool avail() {
    return n > 0;
  }
  virtual T next() {
    --n;
    return *p++;
  }
private:
  int n;
  const T* p;
};

template<class T>
T sum(InSeq<T>& s)
{
  T res = 0;
  while (s.avail())
    res += s.next();
  return res;
}

int x[] = { 3, 1, 4, 1, 5, 9 };

int main()
{
  ArraySeq<int> s(x, 6);
  std::cout << "The sum is " << sum(s) << std::endl;
}

