Я начал использовать boost :: signal2 вместо моего старого сигнала-кода. У меня проблема с администрированием нескольких соединений. Вот моя проблема:
У меня много экземпляров класса Person:
class Person {
public:
void SetName (string new_name)
{
name = new_name;
NameChange (name);
}
string name;
boost::signals2::signal<Person*> NameChange;
};
У меня также есть браузер людей, который должен отслеживать подмножество всех доступных людей на предмет изменений. Поскольку люди могут приходить и уходить из этого подмножества, у меня должен быть способ обработки объектов подключения, и я создал класс (ConnectionList) для обработки этого:
class ConnectionList
{
public:
virtual ~ConnectionList () // drops all connections in "list"
void add (boost::signals2::connection& conn); // adds "conn" to "list"
private:
std::vector<boost::signals2::connection> list;
};
class PeopleBrowser
{
public:
void AddPerson (Person& p)
{
name_change_connections.add (p.NameChange.connect (...));
}
private:
ConnectionList name_change_connections;
};
Это все хорошо, соединения сбрасываются при удалении PeopleBrowser, и есть хороший способ добавить новые соединения.
Однако нам нужно добавить другой метод RemovePerson, и этот метод должен удалить соединения с сигналом NameChange этого экземпляра Person.
Вот где я застрял. Я думаю, я мог бы сделать ConnectionList шаблоном и использовать список, который содержит структуру со ссылкой на сигнал, а также соединение, а затем добавить метод, который отбрасывает все соединения с этим сигналом.
Но похоже, что это такой распространенный случай (по крайней мере, в моем мире у меня есть около 20 классов в этом единственном приложении, которому нужна эта функциональность), поэтому я думаю, что должен быть лучший способ справиться с этим?
По крайней мере, есть ли способ получить ссылку на подключенный сигнал от объекта подключения?
Возможно, libsigc ++ справится с этим лучше / по-другому?