усиление генерации сигнальных слотов

0

Я ищу способ реализовать что-то вроде этого, используя boost

class GenBoost{
  boost::signal<void(void)> m_signal;
  std::function<void (bool)> m_function

  public:
    void setSignal(boost::signal<void(void)> sigArg)
    {
       m_signal = sigArg;
    }

    void setFunction(std::function<void (bool)> &functionArg)
    {
       m_function = functionArg;
       m_signal.connect(boost::bind(&GebBoost::onSignal,this,_1));

    }

    void onSignal(){
        //do something
    }
 };

Как это можно достичь. копирование сигнала невозможно !?

  • 0
    что это должно быть?
  • 0
    @itwasntpete - код ниже. Я имею в виду, я пытался реализовать, как указано выше. Но я не мог.
Показать ещё 2 комментария
Теги:
boost
boost-signals

1 ответ

2
Лучший ответ

Я не уверен на 100% ваших намерений, но, полагая, что onSignal() не нужно будет взаимодействовать с m_signal (и вам нужно только одно подключение к m_signal), кажется, что вы можете полностью отделить m_signal от своего класса. Например, если вы действительно не хотите, чтобы тело "onSignal()" вызывалось до тех пор, пока не была установлена "m_function", вы можете сделать что-то вроде:

class GenBoost{
    std::function<void (bool)> m_function;
    boost::signals::scoped_conection m_connection;

  public:
    void setSignal(boost::signal<void(void)>& sigArg)
    {
        m_connection = sigArg.connect(boost::bind(&GebBoost::onSignal,this));
    }

    void setFunction(std::function<void (bool)> &functionArg)
    {
        m_function = functionArg;
    }

    void onSignal()
    {
        if ( m_function )
            do_work();
    }

    void do_work()
    {
        //do something
    }
};

Обратите внимание, что я m_signal.connect(boost::bind(&GebBoost::onSignal,this,_1)); последний _1 из m_signal.connect(boost::bind(&GebBoost::onSignal,this,_1)); потому что сигнал объявлен как тип void(void) поэтому он должен быть связан с обратным вызовом void. Я также добавил scoped_connection, чтобы, если объект типа GenBoost был уничтожен до сигнала, к GenBoost он подключен, он автоматически отключится, а не позволит сигналу сохранить недопустимый указатель.

В качестве альтернативы, если вам нужно сохранить ссылку на исходный сигнал, вы можете добавить обратно свой исходный элемент сигнала, но в качестве указателя boost::signal<void(void)>* m_signal; , Затем setSignal становится:

void setSignal(boost::signal<void(void)>& sigArg)
{
    m_signal = &sigArg;
    m_connection = m_signal->connect(boost::bind(&GebBoost::onSignal,this));
}

Я по-прежнему рекомендую использовать подключаемое соединение и подключаться в setSignal чтобы вы обеспечивали только одно подключение к одному сигналу (если setSignal вызывается дважды, соединение с первым сигналом автоматически отключается). Если вы идете по указателю, вы должны убедиться, что переданный сигнал имеет срок службы дольше, чем объект GenBoost.

  • 0
    информация о scoped_connection была полезной. Это было именно то, что я искал. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню