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

В настоящее время я перехожу с C# на C++ и переписываю код игрового движка, и я думаю, что я у стены с tr1; По сути, я хочу, чтобы входной слой принимал ввод с сенсорного экрана, а затем запускал обратный вызов, чтобы уведомить любые элементы, прослушивающие этот ввод. Теперь tr1/boost, кажется, делает это очень простым с помощью function и bind, однако запуск обратных вызовов, которые являются 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::neutral по умолчанию. Мне интересно, я что-то упускаю, или, возможно, недостаток сна просто направляет меня по ложному пути? Спасибо, парни!


person JedH    schedule 11.03.2013    source источник
comment
Правильный синтаксис — function<void (MenuActions)>, а не function<void (MenuActions action)>.   -  person Nawaz    schedule 11.03.2013
comment
Какая подпись у MenuScene::handleInputCallback?   -  person juanchopanza    schedule 11.03.2013
comment
@juanchopanza знак void handleInputCallback (действие MenuActions)   -  person JedH    schedule 11.03.2013
comment
В этом случае это выражение tr1::bind(&MenuScene::handleInputCallback, this, MenuActions::neutral); дает вам объект функции без параметров function<void(void)>. Это означает, что ответ @ForEver выглядит правильным.   -  person juanchopanza    schedule 11.03.2013


Ответы (1)


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

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

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

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

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

person ForEveR    schedule 11.03.2013
comment
Пространство имен std::tr1::placeholders. - person juanchopanza; 11.03.2013
comment
Следует отметить, что function и bind соответствуют стандарту C++11 и теперь являются std::function, std::bind и std::placeholders::_n. - person Jan Hudec; 11.03.2013
comment
Спасибо, ребята, это было именно то, что мне было нужно! Два вопроса для уточнения ваших ответов и комментариев: 1) Безопасно ли сейчас использовать std вместо tr1, если я занимаюсь кросс-платформенной разработкой (Windows Phone, Win8, Android, iOS)? 2) @ForEveR, не могли бы вы уточнить, что происходит, когда вы проходите _1? Это просто флаг, который говорит tr1 игнорировать значение по умолчанию? Мне любопытно, так как я, вероятно, буду реализовывать функцию с заполнителем и хотел бы знать, что происходит. Спасибо еще раз! - person JedH; 11.03.2013