Loki-like functors with boost::function?



 DEVELOP > c-Plus-Plus > Loki-like functors with boost::function?

LINK TO THIS PAGE  


rating :  0   |  0


  Page 1 of 1

1

 
Topic: DEVELOP > c-Plus-Plus
User: "Martin Herbert Dietze"
Date: 30 Mar 2006 03:27:43 AM
Object: Loki-like functors with boost::function?
Hi,
in a project I am using callbacks which are called like
ordinary functions but in fact are Loki::Functor's
encapsulating calls to non-static member functions on instances
of different classes.
The approach using Loki::Functor looks like this:
| class X {
| public:
| void foo(int) { }
| };
|
| X x;
|
| typedef Loki::Functor<void, TYPELIST_1(int)> Functor1;
| Functor1 f1(&x, &X::foo);
|
| f1(42); // x disappears, f can be called like a function
The nice thing about it is you do not need to template the
actual type of the object on which you want to call the
member function.
Using boost::function1 and boost::bind you can come close to
this:
| template <class C, typename R, typename A1> class MyFunction
| : public boost::function1 <R, A1> {
| public:
| MyFunction(C *c, R (C::*f)(A1)) {
| boost::function1 <R, A1> t = boost::bind(f, c, _1);
| swap(t);
| }
| };
|
| template<class C>struct A {
| typedef MyFunction<C, void, int> f2(x, &X::foo) Functor2;
| };
|
| A::Functor2<X> f2(&x, &X::foo);
This does not only look more complicated, it is also less
flexible. While with Loki::Functor I can use my function object
on any member function of any class provided the signature
fits, my Functor2 template will only work with class X.
I would like to avoid this dependency since if using the
current boost-based approach I would have to make a large number
of classes using this functor class templates, too.
On the other hand I would like to reduce the number of
third-party libraries my project depends on, and from the
Loki package I am currently only using the Functor class, so
that I would actually prefer to replace its functionality by
something else.
Any idea?
Cheers,
Martin
--
Ruft man einen Hund, dann kommt er. Ruft man eine Katze, dann nimmt
sie das zur Kenntnis, und kommt gelegentlich darauf zurueck.
-=-=- -=-=-=-=- --=-=-
Martin Dietze -=-=- http://www.the-little-red-haired-girl.org
.

User: "Jeff Flinn"

Title: Re: Loki-like functors with boost::function? 30 Mar 2006 07:31:16 AM
Martin Herbert Dietze wrote:

Hi,

in a project I am using callbacks which are called like
ordinary functions but in fact are Loki::Functor's
encapsulating calls to non-static member functions on instances
of different classes.

The approach using Loki::Functor looks like this:

class X {
public:
void foo(int) { }
};

X x;

typedef Loki::Functor<void, TYPELIST_1(int)> Functor1;
Functor1 f1(&x, &X::foo);

f1(42); // x disappears, f can be called like a function


The nice thing about it is you do not need to template the
actual type of the object on which you want to call the
member function.

Using boost::function1 and boost::bind you can come close to
this:

Why not just:
typdef boost::function1<void,int> Functor1;
Functor1 f1( boost::bind( &x::for, &x ) );
f1(42);
Jeff
.
User: "Martin Herbert Dietze"

Title: Re: Loki-like functors with boost::function? 30 Mar 2006 07:39:58 AM
Jeff Flinn <NONONE@nowhere.com> wrote:

Why not just:

typdef boost::function1<void,int> Functor1;

Functor1 f1( boost::bind( &x::for, &x ) );

f1(42);

This would add boost-specific code to dozens of modules
throughout the project. I would like to encapsulate this in a
class which does that magic for the user. However I have not
got around explicitly having to specify the class X as a
template argument.
Cheers,
Martin
--
There's only one serious question. And that is: Who knows how to make love stay?
Answer me that and I will tell you whether or not to kill yourself. Answer me
that and I will ease your mind about the beginning and the end of time. Answer
me that and I will reveal to you the purpose of the moon. -- Tom Robbins
-=-=- -=-=-=-=- --=-=-
Martin Dietze -=-=- http://www.the-little-red-haired-girl.org
.



  Page 1 of 1

1

 


Related Articles
 

NEWER

pg.1232     pg.940     pg.716     pg.544     pg.412     pg.311     pg.234     pg.175     pg.130     pg.96     pg.70     pg.50     pg.35     pg.24     pg.16     pg.10     pg.6     pg.3     pg.1

OLDER