#include template class InSeq { public: virtual bool avail() = 0; virtual T next() = 0; virtual ~InSeq() { } }; template class ArraySeq: public InSeq { 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 T sum(InSeq& s) { T res = 0; while (s.avail()) res += s.next(); return res; } int x[] = { 3, 1, 4, 1, 5, 9 }; int main() { ArraySeq s(x, 6); std::cout << "The sum is " << sum(s) << std::endl; }