В настоящее время я перехожу с C # на C ++ и переписываю некоторый код игрового движка, и я думаю, что я стою на стене с tr1; По сути, я хочу, чтобы слой ввода брал ввод с сенсорного экрана, а затем запускал обратный вызов для уведомления любых элементов, прослушивающих этот ввод. Теперь, кажется, tr1 / boost делает это очень легко благодаря использованию функция а также привязывать, однако запуск обратных вызовов, которые являются void (), не проблема, но теперь я пытаюсь отправить параметры через этот обратный вызов при вызове (например, перечисления).
Проблема здесь в том, что когда я вызываю bind и вставляю параметр, он не действует как заполнитель, а действует как постоянное значение, которое должно быть передано. Например, мой код здесь:
Содержащий класс:
tr1::function<void (MenuActions action)> callback;
callback = tr1::bind(&MenuScene::handleInputCallback, this, MenuActions::neutral);
m_menuUILayer->registerCallback(callback);
Имеет намерение создать функцию и затем связать ее RegisterCallback передает этот обратный вызов в класс-член и сохраняет ссылку. Эта часть работает, но теперь в классе-члене я могу вызвать обратный вызов, однако параметры по умолчанию всегда отправляются …
Класс участника:
if (m_callback)
{
m_callback(MenuActions::backgroundTouchDown);
}
Так что здесь, а не MenuActions :: backgroundTouchDown отправляется в основной содержащий класс в обратном вызове, по умолчанию MenuActions :: Нейтральные все еще используется. Мне интересно, что я что-то упускаю, или, возможно, недостаток сна просто отправляет меня на неверный путь? Спасибо, парни!
Вы должны использовать заполнители
callback = tr1::bind(&MenuScene::handleInputCallback, this,
tr1::placeholders::_1);
а потом звоните как
if (m_callback)
{
m_callback(MenuActions::backgroundTouchDown);
}
и ваша функция handleInputCallback
может иметь параметр по умолчанию, по умолчанию MenuActions::neutral
Других решений пока нет …