Как передать указатель на функцию для привязки? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть следующий код:

_createNewObjectlistener = eventDispatcher->addCustomEventListener(Constants::EVENT_CREATE_OBJECT, std::bind(&ObjectPlacementManager::receiveCreateObjectEvent, this, std::placeholders::_1));
_eventListeners.insert(_createNewObjectlistener);

_moveNewObjectlistener = eventDispatcher->addCustomEventListener(Constants::EVENT_MOVE_NEW_OBJECT, std::bind(&ObjectPlacementManager::receiveMoveCurrentGameObjectEvent, this, std::placeholders::_1));
_eventListeners.insert(_moveNewObjectlistener);

.... many more listeners created

Поскольку единственное различие между кодом создания для каждого слушателя, это Constant::EVENT_NAME и вызываемая функция, я пытаюсь инкапсулировать его в функцию.

Результат bind должен иметь тип const std::function<void(EventCustom*)>&

Функции, подобные ObjectPlacementManager::receiveMoveCurrentGameObjectEvent, имеют одинаковую подпись:

void receiveMoveCurrentGameObjectEvent(EventCustom* event){
 ....
}

Я пытался: Как передать аргумент в std :: bind функции?

typedef void (*callback_function)(EventCustom*);

EventListenerCustom* createCustomListener(callback_function func, std::string EVENT){
    auto eventDispatcher = _dragNode->getEventDispatcher();
    auto listener = eventDispatcher->addCustomEventListener(EVENT, std::bind(&func, this, std::placeholders::_1));
    _eventListeners.insert(_createNewObjectlistener);
    return listener;
}

Но я получаю ошибку:

No viable conversion from '__bind<void (**)(cocos2d::EventCustom *), bejoi::ObjectPlacementManager *, const std::__1::placeholders::__ph<1> &>' to 'const std::function<void (EventCustom *)>'

Я также попытался сделать функцию:

EventListenerCustom* createCustomListener(void* func, std::string EVENT){
    auto eventDispatcher = _dragNode->getEventDispatcher();
    auto listener = eventDispatcher->addCustomEventListener(EVENT, std::bind(func, this, std::placeholders::_1));
    return listener;
}

Но я получаю ошибку:

No viable conversion from '__bind<void *&, mynamespace:: ObjectPlacementManager *, const std::__1::placeholders::__ph<1> &>' to 'const std::function<void (EventCustom *)>'

1 Ответ

1 голос
/ 20 апреля 2019

Первая ошибка связана с тем, что вы берете адрес указателя функции.Итак, вы передаете указатель на указатель на функцию на std::bind.

Вторая ошибка связана с тем, что вы использовали void * и каким-то образом ожидали, что это сработает!

Попробуйте этот MCVE:

struct Event {};

struct Dispatcher {
  void addListener(int, const std::function<void(Event *)> &) {}
};

struct Manager {
  void receive(Event *) {}

  void addListener(int type, void (Manager::*receiver)(Event *)) {
    dis.addListener(type, std::bind(receiver, this, std::placeholders::_1));
  }

  void test() {
    addListener(42, &Manager::receive);
  }

  Dispatcher dis;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...