Re: [ROOT] Generic objects & streaming ptr-to-function

From: George A. Heintzelman (gah@bnl.gov)
Date: Tue Oct 31 2000 - 17:10:54 MET


> Hi George,
> 
> George A. Heintzelman writes:
> ...
>  > TModule::Process() {
>  >   StartProcessing();
>  >   for ( /* each track in a container */ ) {
>  > 	if ((*fPtrToCutFunction)(track)) {
>  > 	  /* Process */
>  >         }
>  >   }
>  > }
>  > But if we wanted to write these modules out, we would have to be able 
>  > to stream somehow pointers-to-function.
> ...
> 
> Instead of pointers-to-function, what about using Functional Objects
> (Functors) as described in Chapter 18 of Stroustrup's C++ P.L. Special
> Ed.?  Basically, instead of using a function you use a class with a
> method like:
> 
> 	bool operator()(TTrack*);
> 
> Since it is just an object, it should be able to be sent through ROOT
> I/O.

Yes, this is a possible way of doing it. This has the unfortunate 
drawback of expanding CINT's dictionary rather dramatically, if this is 
used extensively. A second problem is that you require that the functor 
base class have a virtual operator(), since the whole point is to have 
dynamic dispatch. This amounts to the same overhead as ptr-to-function 
as that's all a virtual function is, so its not a big deal; but it does 
mean that much of the STL function library stuff no longer is so useful 
since they don't use virtual dispatch at all, preferring instead fairly 
heavy template machinery (which works well in a completely compiled 
code, but causes problems in CINT). Eg, not1(DynamicBinderFunctionObj) 
returns a class of type unary_negate<DynamicBinderFunctionObj>, which 
does not derive from DynamicBinderFunctionObj itself.

> This would also gain you the ability to make use of the binder
> functions (bind1st, bind2nd) which would allow people to pass closures
> (function + parameters) to the module.

Like I say, wouldn't be easy to integrate because of the above 
problems. Would be nice, though, if it were possible. One could write 
specializations of these elements of the standard lib for a 
dynamic-dispatch functor, I suppose. It would need a bit of thought.

George Heintzelman
gah@bnl.gov



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