[C++-sig] Re: Boost::Signals - Python functions as slots

Raoul Gough raoulgough at yahoo.co.uk
Fri Mar 26 17:41:29 CET 2004

Benny Kramek benny at kramekweb.com 
Fri Mar 26 07:26:33 EST 2004 

>I'm using Boost::Signals in C++. I want to be able to attach python
>functions as slots to the C++ signals.
> Here is a very simple test that
>doesn't work. Everything compiles OK, but I get a Python error.

>void Button::doOnClick(const boost::signal<void ()>::slot_type& slot)
>    onClick.connect(slot);
>### Python test
>def f():
>    print 'f'
>button = Button()
>### Python error
>    button.doOnClick(f)
>Boost.Python.ArgumentError: Python argument types in
>    Button.doOnClick(Button, function)
>did not match C++ signature:
>    doOnClick(Button {lvalue},
>The demangled name
>boost::slot<boost::function<void ()(), std::allocator<void> > >
>I'm using gcc 3.2.3 and boost 1.31.0

When you pass the Python function f into a C++ routine I guess it is
represented as a boost::python::function object. You can't pass a
boost::python:object where a boost::slot<...> is expected, which is why
you are getting the (run-time) error.

I think you will have to modify your doOnClick member function to
accept a boost::python::function (or maybe boost::python::object)
instead, and use this object to handle the signal. I assume that the
slots/signals code can handle functors (i.e. objects with an
operator()). I'm not sure if you will able to use the Python object
directly for this, you might have to write a thin wrapper like this:

struct python_function {
  boost::python::object my_callable_object;

  python_function (boost::python::object const &obj)
    : my_callable_object (obj)

  void operator()() {

Untested code! I'd be more definite about this, but I don't have access
to the Boost.Python code at the moment.

Raoul Gough.

Yahoo! Messenger - Communicate instantly..."Ping" 
your friends today! Download Messenger Now 

More information about the Cplusplus-sig mailing list