Передача нестатической функции-члена в качестве аргумента функции-члену в другом классе - PullRequest
0 голосов
/ 09 октября 2018

ОБНОВЛЕНИЕ Я понимаю, что в этом вопросе отсутствует надлежащий MCVE, мне потребуется некоторое время, чтобы придумать его.Я обновлю его, когда у меня будет время вернуться к этому, извините.Я ценю ответы до сих пор.


После этого ответа относительно статических функций :

Декларация MyClass)

void MyClass::func ( void (MyOtherClass::*f)(int) ); //Use of undeclared identifier 'MyOtherClass'

Пример функции, передаваемой в func:

void MyOtherClass::print ( int x ) {
      printf("%d\n", x);
}

Вызов функции (in MyOtherClass)

void MyOtherClass::loop(){
    func(&MyOtherClass::print);
}

Как можнопередать функцию-член в качестве параметра функции-члена другого класса ?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

вы не можете просто использовать std::function и std::bind для этого?

class MyOtherClass
{
public:
  MyOtherClass() {}
  void print(int x)
  {
    printf("%d\n", x);
  }
};


class MyClass
{
private:
  std::function<void()> CallbackFunc;

public:
  MyClass() {};
  void AssignFunction(std::function<void(int)> callback, int val)
  {
    CallbackFunc = std::bind(callback, val); //bind it again so that callback function gets the integer.
  }

  void DoCallback()
  {
    CallbackFunc(); //we can then just call the callback .this will, call myOtherClass::print(4)
  }
};

int main()
{
  MyClass myObject;
  MyOtherClass myOtherObject;
  int printval = 4;

  //assign the myObject.callbackfunc with the myOtherClass::print()
  myObject.AssignFunction(std::bind(&MyOtherClass::print, myOtherObject,std::placeholders::_1), 4);

  //calling the doCallback. which calls the assigned function.
  myObject.DoCallback();
  return 0;
}
0 голосов
/ 09 октября 2018

Согласно ISO ответ: «не». В отличие от обычных функций, нестатическая функция-член не имеет смысла без экземпляра класса.В качестве обходного пути вы можете заставить свою вызывающую функцию взять std::function и передать ей лямбду.

Пример:

void calling_func(std::function<void()> f);

struct foo
{
    void func();

    void call()
    {
        calling_func([this]{
            func();
        });
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...