std :: function как callback, возможна ли отмена регистрации?
Вопрос строго оstd::function
и неboost::function
, УвидетьОбновить раздел в нижней части этого вопроса для более подробной информации, особенно в части о том, что нельзя сравнивать непустыеstd::function
объекты в соответствии со стандартом C ++ 11.
C ++ 11std::function
Шаблон класса отлично подходит для ведения коллекции обратных вызовов. Можно хранить их вvector
Например, и вызывать их при необходимости. Тем не менее, поддержание этих объектов и возможность отмены регистрации представляется невозможным.
Позвольте мне быть конкретным, представьте себе этот класс:
class Invoker
{
public:
void Register(std::function f);
void Unregister(std::function f);
void InvokeAll();
private:
// Some container that holds the function objects passed to Register()
};
Пример сценария использования:
void foo()
{
}
int main()
{
std::function f1{foo};
std::function f2{[] {std::cout < "Hello\n";} };
Invoker inv;
// The easy part
// Register callbacks
inv.Register(f1);
inv.Register(f2);
// Invoke them
inv.InvokeAll();
// The seemingly impossible part. How can Unregister() be implemented to actually
// locate the correct object to unregister (i.e., remove from its container)?
inv.Unregister(f2);
inv.Unregister(f1);
}