Существует довольно классная библиотека для обработки вызовов такого рода, и, конечно, это Boost.
Вот Boost.Signals2 , с гарантией корректности даже в многопоточных приложениях:)
Обратите внимание, в частности, на использование класса boost::trackable
, поэтому уничтожение объектов автоматически делает недействительными вызовы до того, как они произойдут.
Примечание: Boost.Signals (его предок) имеет почти те же функции, но не поточнобезопасен