Используя boost.signals2, как подключить динамически размещенные объекты к сигналу

У меня есть класс с именем Candidate содержащий функцию с именем DataUpdate(), Я намерен динамически создавать множество экземпляров Candidate и каждый экземпляр подключать свою функцию DataUpdate() как слот для boost.signals2 сигнал; в готовности принимать сигналы.

Код, который я разработал ниже, дает ошибку:

Ошибка 2, ошибка C2276: ‘&’: недопустимая операция с выражением связанной функции-члена

Я не уверен в правильности кода для достижения желаемого результата. Проблема, кажется, заключается в разыменовании указателя candidateInstance чтобы получить адрес экземпляра DataUpdate() функция для передачи signal.connect(), Кто-нибудь может посоветовать правильный подход?

Candidate *candidateInstance;

//INSTANTIATE CANDIDATE INSTANCE
++DataStream::ID;//increment static variable
candidatesVector.push_back(candidateInstance = new Candidate(ID));

//CONNECT DATAUPDATE() OF CANDIDATE INSTANCE
signal.connect( &((*candidateInstance).DataUpdate) );

//FIRE SIGNAL
signal(BarNumber(), DateTime(), Open(), High(), Low(), Close());

0

Решение

Вы должны использовать bind создать оболочку для функции-члена.

#include <iostream>
#include <memory>
#include <functional>

#include <boost/signals2.hpp>

class Foo
{
public:
void foo()
{
std::cout << "I'm foo() from Foo, this == " << this << std::endl;
}
};

int main()
{
auto foo_ptr = std::make_shared<Foo>();

boost::signals2::signal<void()> sig;

sig.connect(std::bind(&Foo::foo, foo_ptr));

sig();

return 0;
}
2

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

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

По вопросам рекламы [email protected]