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);
}

Ответы на вопрос(1)

Ваш ответ на вопрос