RE: ROOT: pedantic error in dictionary

From: Christian Holm Christensen <cholm_at_nbi.dk>
Date: Wed, 23 May 2007 10:17:04 +0200


Hi Philippe,

On Mon, 2007-05-21 at 16:57 -0500, Philippe Canal wrote:
> Hi Robert,
>
> The last time I looked there was no easy way around it (the problem is
> to pass a pointer to a member function down to a C function thus needing
> to cast it to a void* ... which is more or so illegal in C++).
>
> On the other hand we are working to revamp the dictionary back end of
> CINT. In the process we will update the dictionary format (it will
> use a C++ API) that should take care of the problem.

A suggestion: Wrap the member function call in a Functor object (a class template, deriving from some base class, say FunctorBase), and pass that down. Alexandrescrus book "Modern C++ Design" [1] has more on this. Code for this is available as the Loki project from sourceforge.net [2]. Boost.org [3] has a "function" library that looks like it could be used for this, which I think is considered for inclusion into the ISO C++ 0x standard [4 - chapter 3].  

There's a lot of cool stuff in Andreis book. For example, the factory pattern could be used to substitute the (many) C functions implemented.

    // Factory.h

        template <T, Lock>
        struct Factory : FactoryBase
        {
          FactoryBase& Instance() {
            if (!_instance) {
              _lock.Lock();
              if (!_instance) _instance = new Factory<Foo>;
              _lock.Unlock();
            }
            return _instance;
          }
          ObjectPtr* Create();
          Result* Call(ObjectPtr* o, const std::string& fun, ...);
        private:
          Factory() {
            BaseFactory::Register(this);
          }
          static Lock        _lock;
          static Factory<T>* _instance; 
        }
        ...
        
        // In created dictionary for type Foo 
        Factory<Foo>* Factory<Foo>::_instance = new Factory<Foo>;
        ...
        
        // When called upon to make a Foo object
        FactoryBase& factory =
        FactoryBase::Instance().GetFactory("Foo");
        ObjectPtr*   ptr     = new ObjectPtr(factory->Create());
        ... 
        
and so on. 
        
[1] http://www.moderncppdesign.com/
[2] http://loki-lib.sourceforge.net/

[3] http://boost.org/doc/html/function.html [4] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

Yours,

-- 
 ___  |  Christian Holm Christensen 
  |_| |  -------------------------------------------------------------
    | |  Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
     _|           DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
    _|            Denmark                    Office: (+45) 353  25 404
 ____|   Email:   cholm_at_nbi.dk               Web:    www.nbi.dk/~cholm
 | |
Received on Wed May 23 2007 - 10:17:11 CEST

This archive was generated by hypermail 2.2.0 : Wed May 23 2007 - 17:50:02 CEST