Самый простой подход - использовать std::function<void(int, int)
в качестве типа зарегистрированного обратного вызова: этот объект можно использовать для вызова любой функции [объекта], которая вызывается с двумя int
с.В частности, он может вызвать функцию-член CEngine::GUIControlsCallback(int, int)
, которая на самом деле имеет три параметра:
- два очевидных параметра для функции-члена типа
int
- неявный указатель наобъект (который становится
this
)
Способ, которым это сделано, состоит в создании функционального объекта, который в качестве первого параметра предоставляет указатель на объект CEngine
и принимает два целых числа:
struct CEngine_bind {
CEngine_bind(CEngine* engine): engine_(engine) {}
void operator()(int i0, int i1) { this->engine_->GUIControlsCallback(i0, i1); }
CEngine* engine_;
};
В качестве альтернативы, вы можете использовать std:bind()
, который представляет собой функцию с соответствующей привязкой:
CEngine engine; // ... wherever this object is coming from)
std::function<void(int, int)> callback(std::bind(&CEngine::GUIControlsCallback, &engine,
std::placeholders::_1, std::placeholders::_2));
... и затем установить объект callback
в качестве обратного вызова.Этот объект просто вызывается, передавая два целочисленных параметра, которые вызовут функцию-член ссылочного объекта:
callback(10, 20);
вызовет
engine.GUIControlsCallback(10, 20);
std::function<void(int, int)>
является копируемым,то есть вы можете легко хранить его в своем CGUIManager
классе.