2013-03-11 7 views
1

Я сейчас перехожу из C# в C++ и переписываю код игрового движка, и я думаю, что я на стене с tr1; По сути, я хочу, чтобы входной уровень вводился с сенсорного экрана, а затем запускал обратный вызов для уведомления о любых элементах, которые прослушивали этот вход. Теперь tr1/boost, похоже, делает это очень простым с помощью функции и связывает, однако обходные обратные вызовы, которые являются void(), не проблема, но теперь я пытаюсь передать параметры через этот обратный вызов при вызове (перечисления, например).Как использовать функцию tr1 и связывать функции с изменяющимися параметрами?

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

+0

Правильный синтаксис 'функция <аннулируются (MenuActions)> ', а не' function '. – Nawaz

+0

Что такое подпись 'MenuScene :: handleInputCallback'? – juanchopanza

+0

@juanchopanza sig is ** void handleInputCallback (действие MenuActions) ** – JedH

ответ

5

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

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

, а затем вызвать как

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

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

+1

Пространство имен: 'std :: tr1 :: placeholders'. – juanchopanza

+0

Следует отметить, что 'function' и' bind' внесли его в стандарт C++ 11 и теперь являются 'std :: function',' std :: bind' и 'std :: placeholders :: _' n. –

+0

Спасибо, ребята, это было именно то, что мне нужно! Два вопроса для разработки ваших ответов и комментариев: 1) Безопасно ли использовать std через tr1 сейчас, если я занимаюсь кросс-платформенной разработкой (Windows Phone, Win8, Android, iOS)? ** 2) ** @ForEveR, не возражаете ли вы разобраться, что происходит, когда вы проходите _1? Это просто флаг, который говорит tr1 игнорировать значение по умолчанию? Мне любопытно, поскольку я, скорее всего, буду выполнять функцию с ** placeholder ** там намного больше и хотел бы знать, что происходит. Еще раз спасибо! – JedH