Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2001-04-20 10:22:55

From: "Dale Peakall" <dale.peakall_at_[hidden]>

> Bill Kempf wrote:
> > As pointed out in another post, member functions can be trivially
> > changed into function objects eliminating the need for direct support
> > by any_function. In early discussions it was seen as wasted
> > duplication of effort to address this in a "callback" class when
> > standard adapter classes were also in the pipe (i.e. boost::bind).
> I wouldn't class myself as an expert at these things, but I at least
> thought I had a reasonable idea, and I can't see how you can "trivially"
> convert a class, member function pair into a callback (at least on my
> totally broken MSVC compiler - no void return's, no partial

"Trivially" is an overoptimistic stance. :-)

BTW, MSVC 7.0b1 does support void returns; another pleasant surprise.

Take a look at the attached file for a preliminary 'bind' function. It only
supports member functions with zero or one arguments, and I haven't tested
it extensively, but it may help until 'the' boost::bind arrives.

The first form of 'bind' converts a member function pointer to a function
object that takes a pointer, a reference, or a boost::shared_ptr as its
first argument.

The second form of 'bind' converts a member function pointer, object pointer
pair into a function object.

You must define the macros BOOST_NO_VOID_RETURNS and
BOOST_NO_PARTIAL_ORDERING depending on the compiler. When both are defined
(MSVC 6.0) you have to supply a dummy integer as a last parameter to bind;
use 1, or 5, or 42, or whatever you like, but not zero (it's also a

Here's a short example:

#include <iostream>


#include "bind.hpp"

struct X
 void f() const
  std::cout << "X(" << this << ")::f() const;\n";

 void k()
  std::cout << "X(" << this << ")::k();\n";

 void g(int i)
  std::cout << "X(" << this << ")::g(" << i << ");\n";

 void h(int const & i)
  std::cout << "X(" << this << ")::h(" << i << ");\n";

 void q(int & i)
  std::cout << "X(" << this << ")::q(" << i++ << ");\n";

int main()
 X x;


 bind(&X::f, &x)();
 bind(&X::k, &x)();

 int i(5);

 bind(&X::g)(x, i);
 bind(&X::h)(x, i);
 bind(&X::q)(x, i);
 bind(&X::q)(x, i);

 bind(&X::g, &x)(i);
 bind(&X::h, &x)(i);
 bind(&X::q, &x)(i);
 bind(&X::q, &x)(i);

 return 0;

Peter Dimov
Multi Media Ltd.

Boost list run by bdawes at, gregod at, cpdaniel at, john at