В настоящее время я экспериментирую с написанием очереди событий на С++ 11. Я использую std::bind
для получения объектов std::function
, которые вызываются, когда происходят определенные события. Код для этого примерно выглядит так:
class A
{
public:
void handle();
};
class B { ... };
// Later on, somewhere else...
std::vector< std::function< void() > functions;
A a;
B b;
functions.push_back( std::bind( &A::handle, &a ) );
functions.push_back( std::bind( &B::handle, &b ) );
// Even later:
for( auto&& f : functions )
f(); // <--- How do I know whether f is still "valid"?
Есть ли способ гарантировать действительность объекта функции, чтобы я мог не споткнуться здесь о неопределенном поведении?
Я уже рассматривал этот вопрос здесь, std ::function в функцию-член объекта и время жизни объекта, но обсуждалось только, вызывает ли удаление указателя на связанный объект неопределенное поведение. Меня больше интересует, как справиться с уничтожением такого объекта. Есть ли способ обнаружить это?
РЕДАКТИРОВАТЬ: Чтобы уточнить, я знаю, что не могу гарантировать время жизни для нестатических, неглобальных объектов. Было бы достаточно получить уведомление об их уничтожении, чтобы можно было удалить недопустимые функциональные объекты.