2016-09-22 4 views
2

Я пытаюсь написать шаблон наблюдателя в C++ поэтому у меня есть карта, которая содержит именем_событие -> вектор функций обратного вызоваудалить элемент из вектора станда :: функции

функцию обратного вызова сохраняется в векторе, как

std::function<void(void *)> 

так выглядит карта

std::unordered_map<std::string, std::vector<std::function<void(void *)>>> 

Я могу добавить слушателей к вектору и получать и отвечать на уведомления о событиях. Моя проблема заключается в реализации отсоединения.

Так что std :: function не может сравниться, поэтому стереть/удалить нет, поэтому я хотел искать вектор и сравнивать вручную.

я обнаружил, что this question имел успех, используя зУю :: функции :: цели получения доступа к базовым указателям, но я не могу использовать это, так как я использую зЬй :: BIND для инициализации обратного вызова:

std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1) 

Я просто хочу сравнить базовую функцию-член ptrs или даже сравнить с базовым объектом ptr, к которому связана функция-член. Там в любом случае?

Я хотел бы, чтобы избежать обертывание член Fn PTR в объекте, который содержит хэш, хотя это выглядит как я, возможно, придется идти по этому пути ...

+2

Не могли бы вы привести пример того, как вы хотите добавлять/удалять элементы с карты? – Holt

+0

Мне кажется, что вы уже знаете ответ ... :-) – skypjack

+1

Вы не можете это сделать, не сохранив указатель на рассматриваемый объект для использования в качестве ключа. Мой impl использует weak_ptr и проверяет сбор для удаления expired() перед отправкой события. Attach is (shared_from_this(), & class :: member), detach is (shared_from_this()). – Robinson

ответ

2

Когда я делаю это, я возвращаю маркер к коду прослушивания.

Моя обычная модель должна иметь weak_ptr<function<sig>> в вещателе, а токен - shared_ptr<void> (на сохраненный слабый ptr).

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

Если вы никогда не транслируете это, это может привести к ненужным бесполезным старым мертвым ресурсам, поэтому в общедоступных рамках я могу получить что-то с гарантией bettter. Но в любом случае легко и быстро.

+0

, пожалуйста, напишите пример кода, приведенного выше? –

+0

@segme http://stackoverflow.com/a/34400239/1774667 - это предыдущий эскиз на SO. Я не знаю, насколько это лучшее, что я опубликовал публично или нет, но это должно дать вам эту идею. – Yakk

Смежные вопросы