0

我正在编写一个包装器boost::signals2::signal以获得更清洁、更易于使用的界面。这是我想出的:

#include <boost/signals2.hpp>

// Wrapper class template for boost::signals2::signal
template<typename T>
class Signal {
    typedef typename boost::signals2::signal<T> SignalType;
public:
    // Trigger the signal
    void operator() () { sig(); }

    // Attach a listener
    boost::signals2::connection operator+=(const typename SignalType::slot_type& slot)
        { return sig.connect(slot); }

private:
    SignalType sig;
};

class ClassThatGeneratesEvents {
public:
    void generateEvents(int n) {
        while (n-- > 0) {
            SomethingHappened();
        }
    }

    Signal<void ()> SomethingHappened;
};

void func()
{
    ;
}

class ClassThatListensForEvents {
public:
    ClassThatListensForEvents(ClassThatGeneratesEvents& ev) {
        received_count = 0;

        // This works
        ev.SomethingHappened += func;

        // This doesn't!
        ev.SomethingHappened += bind(&ClassThatListensForEvents::event_handler, this, _1);
    }

    void event_handler() {
        received_count++;
    }

    int received_count;
};

我不确定这是我能想到的最好的包装界面,并且让SomethingHappened成为公共成员可能会有一些缺点。虽然我不介意听听你对此的看法,但这不是这个问题的意义所在。

我想知道如何将回调传递给+=操作员。正如我在ClassThatListensForEvents函数回调中所写的那样,没有问题,但是使用结果bind会产生大量难以阅读的模板编译器错误。

4

2 回答 2

3

你的信号有一个void()签名,所以它不需要参数。您正在尝试分配一个带有boost::bind一个参数的对象(因为它使用_1),这是不兼容的。因此你得到一个错误。目前尚不清楚您期望ev参数event_handler来自何处。如果您绑定一个实际值而不是_1签名将是兼容的。

于 2013-02-26T12:29:23.270 回答
0

信号和回调的签名不同,我认为这是错误

于 2013-02-26T12:31:01.130 回答