La pregunta original tenía como objetivo crear un mecanismo genérico de manejo de eventos que funcione de manera consistente en diferentes clases. En lugar de confiar en métodos estáticos y pasar por punteros de instancia de clase, se puede emplear un enfoque C más moderno usando std :: function y std :: bind.
la clase de controlador de eventos ahora acepta un objeto std :: function como argumento. Un objeto de función representa una entidad invocable que se puede pasar como un puntero de función normal. El método del controlador de eventos AddHandler toma un std :: function
class EventHandler { public: void addHandler(std::functioncallback) { cout vinculante funciones específicas
para vincular un método de clase específico al controlador de eventos, se utiliza std :: bind. std :: bind especifica este puntero y la función que se llamará cuando se activa el evento.
class MyClass { public: MyClass(); // Note: No longer marked `static`, and only takes the actual argument void Callback(int x); private: int private_x; }; MyClass::MyClass() { using namespace std::placeholders; // for `_1` private_x = 5; handler->addHandler(std::bind(&MyClass::Callback, this, _1)); } void MyClass::Callback(int x) { // No longer needs an explicit `instance` argument, // as `this` is set up properly coutfunciones independientes y funciones lambda
Si la devolución de llamada es una función independiente sin un contexto de clase, no se requiere std :: bind. { // ... } int main () { // ... Handler-> AddHandler (FreestandingCallback); }
void freeStandingCallback(int x) { // ... } int main() { // ... handler->addHandler(freeStandingCallback); }handler-> addHandler ([] (int x) {std :: cout de esta manera, usando std :: std :: std :: bind :: Atning y std :: y solución genérica para devoluciones de llamada que se pueden aplicar a diferentes clases y funciones.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3