Вызовите член класса std::function с помощью std::mem_fn

Мой план состоит в том, чтобы создать несколько классов слушателей, которые имеют предопределенные "ловушки обратного вызова".

В приведенном ниже примере класса Foo имеет "обратный вызов" называется onChange, Во время создания будет установлена ​​функция обратного вызова по умолчанию. Он также может быть установлен на произвольную функцию, которая обеспечивает правильный интерфейс, как показано с объектом f1 и функция callback(),

Проблема в том, когда я хочу вызвать объект-член onChange внутри цикла for компилятор говорит, что я привожу много аргументов. я знаю о проблеме, что я не предоставляю функцию-член std::mem_fn но вместо этого член объекта, который является оберткой функции.

Как мне удается передать аргумент std::function член объекта класса Foo без использования std::bind и использовать std::mem_fn вместо того, как показано в примере?

struct Foo
{
  Foo()
  {
    // default callback
    onChange = [](int value)
               -> void { std::cerr << "Foo::onChange( " << value << " )" << std::endl; };
  }

  // class destructor
  virtual ~Foo() {}

  std::function<void(int value)> onChange;

};


void callback(int value)
{
  std::cerr << "callback( " << value << " )" << std::endl;
}


int main()
{
  Foo f0;
  Foo f1;
  f1.onChange = callback;

  auto vec = std::vector<Foo>();
  vec.push_back(f0);
  vec.push_back(f1);

  auto func_wrapper = std::mem_fn( &Foo::onChange );

  for (auto f : vec)
  {
    func_wrapper(f, 42);
  }
}

0 ответов

Другие вопросы по тегам