template <class S> class Vector;
template <class S>
class VectorClosure {
public:
virtual int exec(Vector<S> &) const { return 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>());
}