C ++ Boost Сигналы, соединяющие две функции из двух разных классов в шаблоне

Я пытаюсь установить связь между функцией в одном классе, чтобы я мог вызвать ее в другом классе. Ответы, которые я нашел, либо слишком конкретны, либо, может быть, я что-то упускаю, потому что не могу понять, что я делаю неправильно. Кроме того, я немного новичок в библиотеке надстройки, поэтому прошу прощения за любые глупые вопросы, которые я могу задать.

Настройка для моего рабочего процесса в основном это …

class MyClass : public BaseClass {

void setup();
void myFunc(datatype);

OtherClass myOtherClass;

}

void setup()
{
OtherNamespace::addListener(this, myOtherClass);
}

namespace OtherNamespace {

class OtherClass {

signals::signal<void (datatype)> myConnection;

}

template<class A, class B>
void addListener(A * app, B & connection)
{
connection.myConnection.connect( 'I don't know what to do here' );
}
}

По сути, функция addlistener не устанавливает связь между сигналом и функцией. Я знаю, что там, где я не знаю, что делать, я делаю что-то не так, но я просто не могу понять, что в этом плохого. Я делаю это как вспомогательную функцию, чтобы я мог передавать функции из одного класса в другой, а затем вызывать их, когда они присоединены. Я пытаюсь создать событие домино из соединения через веб-сокет, и мне явно не хватает чего-то очень важного. Любая помощь будет по достоинству оценена.

Я на Xcode и Boost и MacBook Pro.

0

Решение

Вы должны подключиться к signal соответствие slot, который является подлежащий выкупу имея соответствующую подпись. Лучшее решение — оставить создание слота для абонента вашего addListener функция (следующий ваш код, в SSCCE форма):

#include <boost/signals2.hpp>

typedef int datatype;
class BaseClass
{};

namespace OtherNamespace
{
class OtherClass
{
public:
boost::signals2::signal<void (datatype)> myConnection;
};

template<class A, class B>
void addListener(A app, B & connection)
{
connection.myConnection.connect(app);
}
}

class MyClass : public BaseClass
{
public:

void setup();
void myFunc(datatype)
{}

OtherNamespace::OtherClass myOtherClass;

};

void MyClass::setup()
{
// let the caller decide how to make the slot
OtherNamespace::addListener(boost::bind(&MyClass::myFunc, this, _1), myOtherClass);
}
1

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

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