[ROOT] TObject operator <<'s

From: George Heintzelman (gah@bnl.gov)
Date: Fri Apr 28 2000 - 21:10:22 MEST


Hi Root Team,

When doing generic programming with templates -- which I know the ROOT 
team isn't going to do, but it should support its users doing -- it is 
very inconvenient to have different Streamer invocations between 
TObject's and Plain Old Data types. I.e., one would like to simply be 
able to write

template <class T> class X: public TObject {
  T fDataMember; // Some data member
  ...
}

and then 

template<class T> X::Streamer(TBuffer &buf) {
  if (buf.IsReading()) {
	buf >> fDataMember;
 	...
  } else {
	buf << fDataMember;
  }
}

expecting the Streamer to work for both X<TH1F> and X<Int_t>.

Unfortunately this does not work right now, because Int_t's require an 
operator>>, and TObjects require a call to Streamer(buf).

The fix would be quite simple: In TObject.h, include the following two 
little inline functions:

TBuffer & operator<<(TBuffer &buf, const TObject &obj) { 
  return const_cast<TObject &>(obj).Streamer(buf);
/* The const declaration and const_cast are needed to allow true 
generic programming with const object types but avoid the problem that 
the Streamer, since it does both input and output, is not declared 
const. */
}

TBuffer & operator>>(TBuffer &buf, TObject &obj) {
  return obj.Streamer(buf);
}

George Heintzelman
gah@bnl.gov



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:24 MET