Как реализовать обработчик удаления в событии C ++ - PullRequest
3 голосов
/ 11 января 2012

У меня есть класс Event.В AddHandler(thisPtr, callback) я использую tr1::bind на thisPtr и callback и в итоге у меня есть список:

typedef std::tr1::function<void( int& )> CallbackFunction;
std::list< CallbackFunction > m_handlers;

Но как я могу реализовать метод удаления обработчика, если tr1::function несопоставим?

Должен ли я сохранить карту от указателей объектов и обратных вызовов до tr1::function и удалить карту с равным указателем объекта и указателем обратного вызова для аргументов в RemoveHandler?Это безопасный подход?

1 Ответ

1 голос
/ 11 января 2012

Поскольку вы используете std :: list, который никогда не делает недействительными итераторы, пока элемент остается в контейнере, вы можете использовать итератор для отслеживания вставляемых функций.Пример:

typedef std::list<CallbackFunction> func_list;
typedef typename func_list::iterator func_it;
func_it Insert(func_list & l, Callback c)
{
    l.insert(l.begin(), c);
    return l.begin();
}

Теперь вы можете вызвать эту функцию для вставки обратного вызова, и она вернет итератор, который вы можете использовать для ее удаления, например:

func_it it = Insert(l, c);
l.erase(it);
...