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

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

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

Решение

Я не уверен на 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
}
};

Обратите внимание, что я снял последний _1 от m_signal.connect(boost::bind(&GebBoost::onSignal,this,_1)); потому что сигнал объявлен как тип void(void) так должно быть связано с void Перезвоните. Я также добавил scoped_connection, чтобы, если объект типа 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 объект.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector