Я пытаюсь написать шаблон наблюдателя в 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 в объекте, который содержит хэш, хотя это выглядит как я, возможно, придется идти по этому пути ...
Не могли бы вы привести пример того, как вы хотите добавлять/удалять элементы с карты? – Holt
Мне кажется, что вы уже знаете ответ ... :-) – skypjack
Вы не можете это сделать, не сохранив указатель на рассматриваемый объект для использования в качестве ключа. Мой impl использует weak_ptr и проверяет сбор для удаления expired() перед отправкой события. Attach is (shared_from_this(), & class :: member), detach is (shared_from_this()). – Robinson