Listing 6

(a)
virtual void invoke() {
   str->getline(cp,siz);
}

(b)
virtual void invoke() {
   *str >> *d;
}

(c)
template<typename STREAM, typename DATATYPE>
class input_target : public iotarget {
  private:
    STREAM *str;
    DATATYPE *d;
  public:
    input_target(STREAM *isp,DATATYPE *data): str(isp),d(data) {}
    virtual void invoke() { *str >> *d; }
};