Я ищу способ реализовать что-то вроде этого, используя повышение
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
}
};
Обратите внимание, что я снял последний _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
объект.
Других решений пока нет …