Я ищу способ реализовать что-то вроде этого, используя 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
}
};
Как это можно достичь. копирование сигнала невозможно !?
Я не уверен на 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
.