Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Multiple slots of different signatures

It is simple to have an object provide multiple slots through operator() functions of different signatures. The following class does so through providing unary slots of different types:

class SignalIntFloatCollector
{
    optional<int> last_int;
    optional<float> last_float;
public:
    typedef void result_type;
    
    void operator()(int x)
    {
        last_int = x;
    }
    void operator()(float x)
    {
        last_float = x;
    }
    optional<int> GetLastInt()
    {
        return last_int;
    }
    optional<float> GetLastFloat()
    {
        return last_float;
    }
}; // end class SignalIntFloatCollector

In such cases, where the operator() functions differ in their signature, standard connection operators will work out the correct connection:

Table 1.9. multiple slots example

fused

unfused

signals::storage<void (), signals::unfused> banger;
signals::storage<void (float), signals::unfused> floater;
floater(2.5f);
SignalFloatDuplicator duplicator;
SignalMultiCollector collector;

banger
    | collector
    |
    (floater
     | collector
     | (duplicator >>= collector)).send_slot();

banger();
BOOST_CHECK_EQUAL(collector.GetCount(), 1);
BOOST_CHECK_EQUAL(collector.GetLast(), optional<float>(2.5f));
BOOST_CHECK_EQUAL(collector.GetLast1(), optional<float>(2.5f));
BOOST_CHECK_EQUAL(collector.GetLast2(), optional<float>(2.5f));

Copyright © 2007 Stjepan Rajko

PrevUpHomeNext