"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo implementar devoluciones de llamada genéricas de C ++ usando miembros de clase y `std :: function`?

¿Cómo implementar devoluciones de llamada genéricas de C ++ usando miembros de clase y `std :: function`?

Publicado el 2025-03-22
Navegar:539

How to Implement Generic C   Callbacks Using Class Members and `std::function`?

C Callback usando miembro de clase con implementación genérica

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.

manejador de eventos con std :: function

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 como un argumento, donde la función aprobada no tiene valor de retorno y toma un número entero como argumento.

class EventHandler
{
public:
    void addHandler(std::function callback)
    {
        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
    cout  

funciones 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.

Último tutorial Más>

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