Loki-like functors with boost::function?

  • Thread starter Martin Herbert Dietze
  • Start date
M

Martin Herbert Dietze

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
 
J

Jeff Flinn

Martin said:
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:


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
 
M

Martin Herbert Dietze

Jeff Flinn said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
474,262
Messages
2,571,056
Members
48,769
Latest member
Clifft

Latest Threads

Top