Как сохранить boost::signal::connections для последующего отключения?

Я хочу реализовать класс, который использует boost::signal для обратных вызовов. Другие объекты могут зарегистрировать свои функции обратного вызова, используя AddHandler() а также RemoveHandler() методы.

В одном SO ответе предлагается отслеживать boost::signal::connection объекты, возвращенные из connect(), но в другом предложено, что мы не делаем! Я не понимаю, как управлять соединениями.

Как бы я мог посмотреть, какие connection отключить позже, когда у меня есть только slot_type?

class MyClass {
public:
    typedef void Handler();
    void AddHandler(const boost::signal<Handler>::slot_type& aHandler) {
        mSignal.connect(aHandler);
    }
    void RemoveHandler(const boost::signal<Handler>::slot_type& aHandler) {
        mSignal.disconnect(aHandler); // compiler error!
    }
private:
    boost::signal<Handler> mSignal;
};

Я хочу, чтобы абонент мог сделать что-то вроде:

MyObject lMyObject;
lMySignaler.AddHandler(boost::bind(&MyObject::OnEvent, lMyObject));
...
lMySignaler.RemoveHandler(boost::bind(&MyObject::OnEvent, lMyObject));

1 ответ

Решение

Вместо того, чтобы использовать const boost::signal<Handler>::slot_type& в качестве типа моего параметра я изменил их на указатели функций. Затем я использовал указатели функций в качестве ключей в std::map отслеживать boost::signals::connections. Когда RemoveHandler называется я только что позвонил disconnect на связи и сотри запись на карте.

Другие вопросы по тегам