Как использовать функцию tr1 и привязку для функций с изменяющимися параметрами?

В настоящее время я перехожу с 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 :: Нейтральные все еще используется. Мне интересно, что я что-то упускаю, или, возможно, недостаток сна просто отправляет меня на неверный путь? Спасибо, парни!

1

Решение

Вы должны использовать заполнители

callback = tr1::bind(&MenuScene::handleInputCallback, this,
tr1::placeholders::_1);

а потом звоните как

if (m_callback)
{
m_callback(MenuActions::backgroundTouchDown);
}

и ваша функция handleInputCallback может иметь параметр по умолчанию, по умолчанию MenuActions::neutral

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]