Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::bind for C function
From: Kevin Martin (kev82_at_[hidden])
Date: 2012-12-21 04:21:09


On 20 Dec 2012, at 23:30, Philipp Kraus wrote:

> So I would like to use boost::bind / boost::function to create the binding
> to a class method:
>
> boost::function<CFunction>( boost::bind(&MyClass::myMethod, this) )

As Lars Viklund said, boost::bind returns an object, whereas a c-function is just a pointer - it is not possible to convert an object into a pointer.

Assuming this is Lua (based on your posts of lua-l and the typedef). I think you have two choices. If this is about another API then ignore the rest of the message!

1) If you really need to use boost::bind then you need to have some way to box the object in lua. This is relatively complicated, and completely unnecessary to simply call a class method. However, I can provide an example if necessary.

2) Create a closure with the object's address stored as a lightuserdata.

int callobjectmethod(lua_State *l) {
        Object *x = (Object *)lua_tolightuserdata(l, lua_upvalueindex(1));
        return x->method(l); //Make sure this doesn't throw, or enclose in try/catch
}

Instead of using lua_pushcfunction, you should use lua_pushcclosure as follows

Object o;
lua_pushlightuserdata(l, &o);
lua_pushcclosure(l, callobjectmethod, 1);

You must remember you you are responsible for the lifetime of the object and must keep it in scope while the closure still exists.

There are many ways to achieve what you're trying to do, and the most appropriate depends on many things. Lua has a beautifully simplistic API, that doesn't take long to learn with the right materials. The PiL3 book comes out soon, I suggest you spend some time reading it, as it will help you enormously with these kind of problems.

Thanks,
Kevin


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net