es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puede std::function tener un puntero a función como tipo?

Supongamos que tengo el tipo de callback en estilo C como se muestra a continuación. Para C++, podría crear un tipo de std::function como callback2, y este tipo de declaración son todos los ejemplos que pude encontrar. Pero en lugar de escribir la firma nuevamente, ¿puedo reutilizar callback como callback3 a continuación?

Si es posible usar callback3,

  1. ¿Cómo puedo llamar al callback? ¿Es c.target(); como se muestra a continuación la forma correcta de llamar al callback?
  2. ¿Cómo puedo pasar una función miembro? Para el tipo común, podría usar worker2([this]() {toBeCalled();}); pero worker3([this]() {toBeCalled();}); no funcionó.

Código

typedef void (*callback)();
typedef std::function callback2;
typedef std::function callback3;

void worker(callback c)
{
    c();
}

void worker2(callback2 c)
{
    c();
}

void worker3(callback3 c)
{
    //¿Es esta la forma de llamar al callback?
    c.target();
}

class Caller
{
public: Caller()
    {
        //worker2([this]() {toBeCalled();});
        worker3(????);
    }
     void toBeCalled()
    {
         std::cout << "toBeCalled()";
    }
};
Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible reutilizar el tipo callback al definir el tipo std::function. La manera correcta de declarar callback3 sería:

    typedef std::function<void(callback)> callback3;
    

    Esto define un tipo std::function que toma como argumento un tipo callback.

    1. Para llamar al callback, necesitarías llamar a c() dentro de la función worker3 como se muestra a continuación:
    void worker3(callback3 c)
    {
        c(&toBeCalled);
    }
    

    Aquí, &toBeCalled se pasa como argumento a c(), que es un puntero a la función que se llamará.

    1. Para pasar una función miembro, podrías usar una función lambda que capture el puntero this y llame a la función miembro. Aquí tienes un ejemplo:
    worker3([this](){
        toBeCalled();
    });
    

    Aquí, se define una función lambda que captura el puntero this y llama a la función miembro toBeCalled() dentro de la clase Caller. Esta función lambda se puede pasar a la función worker3 como argumento.</void(callback)>

Comments are closed.