Boost logo

Boost :

From: Daniel James (daniel_at_[hidden])
Date: 2004-11-18 09:00:40


I've written a macro (the implementation is attached) for generating a
function object for using overloaded functions with generic code such as
the STL algorithms and boost::bind. A simple example of it's use:

     void foo(int);
     void foo(char*);

     GENERATE_OVERLOADED(void, foo);

     int main()
     {
         int values[] = { 1, 2, 3, 4 };
         std::for_each(values, values+4, foo_overloaded);
     }

GENERATE_OVERLOADED (yes, the naming is pretty bad) creates an object
called which contains overloaded calls to operator() which forward to
the named functions. Something like:

     struct foo_overloaded_type
     {
         void operator() const
         {
             return foo();
         }

         template <class T1>
         void operator(T1 const& p1) const
         {
             return foo(p1);
         }

         template <class T1, class T2>
         void operator(T1 const& p1, T2 const& p2) const
         {
             return foo(p1, p2);
         }

         // etc.
     } foo_overloaded;

The main advantage is that you don't have to select the desired
overload. It can also be useful when different calls will have different
argument types such as iterating over a tuple in fusion (I guess you
could call it a visitor).

Any comments on this? Would anyone else find this useful? Also, has
anyone done something similar? I'd be surprised if no one has, I always
feel like I'm missing something when I'm doing this kind of thing.

The implementation is lacking in several ways - it doesn't work for
non-const references, the return type is fixed, needs to deal with
member functions, namespace issues and so on. I suppose, it could also
be better integrated with bind, lambda or pheonix.

Daniel




Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk