template <class S> class Vector; template <class S> class VectorClosure { public: virtual int exec(Vector<S> &) const = 0; }; template <class S> class Vector { public: int apply(const VectorClosure<S> &c) { return c.exec(*this); } }; template <class S> class VectorVector : public VectorClosure<S> { public: virtual int exec(Vector<S> &v) const { return (int)sizeof(v); } }; int main() { Vector<double> u; return u.apply(VectorVector<double>()); }