Boost logo

Boost Users :

From: Darren Vincent Hart (dvhart_at_[hidden])
Date: 2003-05-30 13:38:57


Similar to my last post, this is a slightly different implementation
where the handler has a signal of its own. Now I can't seem to bind to
the handler functor, getting a compiler message like:

/usr/include/boost/bind.hpp:60: error: `bool (handler::*)(char)' is not
a class, struct, or union type

The goal is that when the keypress signal is emitted, it will execute
the handler which will receive the char (key), test it, and emit its
signal (sig) if appropriate.

Any help would again be much appreciated, the short code follow, with
the problematic bind statement commented:

Thanks in advance,

Darren Hart

compile: g++ test.cpp -o test -lboost_signals

// test.cpp ----------------------------------------------------
#include <iostream>
#include <boost/signal.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/bind/apply.hpp>

using namespace std;

struct widget
{
        boost::signal<bool ()> sig;
        boost::signal<bool (char)> keypress;
        bool test()
        {
                cout << "widget::test() - sig empty: " << (sig.empty() ? "true" :
"false") << endl;
                sig();
                return true;
        }
};

struct handler
{
        char key_;
        boost::signal<bool ()> sig;
        
        handler(char key) : key_(key) { }
        
        bool operator()(char key)
        {
                cout << "handler::operator() - received a " << key << endl;
                if (!sig.empty() && key == key_)
                {
                        cout << "\texecuting slot\n\t";
                        sig();
                }
                cout << endl;
                return true;
        }
};

struct no_op
{
        bool operator()() { cout << "no_op::operator() - doing nothing" <<
endl; return true; }
        bool test() { cout << "no_op::test()" << endl; return true; }
};

int main()
{
        // instantiate two widgets
        widget widget_a;
        widget widget_b;
        
        // instanstiate the functions object (and test them)
        no_op no_op_;
        handler handler_a('A'); handler_a.sig.connect(no_op_);
        no_op_();
        handler_a('A');
        
        // connect the function objects to the widgets
        widget_a.sig.connect(no_op_);
        
        // THE PROBLEM IS HERE - HOW DO I BIND TO handler_a.test(char) ?
        widget_b.keypress.connect( boost::bind(&handler::operator(),
&handler_a) );
        // END PROBLEM
        
        cout << "signalling widget_b.keypress('B')" << endl;
        widget_b.keypress('B'); // call the handler 3 times, but never execute
its slot
        
        cout << "\nsignalling widget_b.keypress('A')" << endl;
        widget_b.keypress('A'); // call the handler 3 times, executing the slot
        
        return 0;
}


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