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.

¿Qué significa exactamente que los funtores en C++ tienen un estado y otras funciones regulares no tienen un estado?

Soy nuevo en los conceptos de STL en C++, y cuando estoy revisando un functor me encuentro con una estructura, en ese momento el functor tiene un estado, mientras que otras funciones regulares no tienen estado. ¿Qué significa realmente esto?

Hasta ahora, he visto información que dice que un functor tiene estado para poder acceder y almacenar los datos de su clase donde se sobrecarga el operador (), y otras funciones regulares sólo pueden acceder a los parámetros que se le pasan ya que no tienen estado.

Pero mira el siguiente código:

class MyFuncPtr
{
public:
    int a;

    int operator ()(int b)
    {
        return a + b;
    }

    MyFuncPtr(int val)
    {
        a = val;
    }

    int sum(int b)
    {
        return a + b;
    }
};

int main()
{
    cout << "¡Hola Mundo!\n";

    MyFuncPtr obj(5);

    int c = obj(15);

    int d = obj.sum(15);
}

Aquí, tanto con el functor como con la función normal, puedo hacer lo mismo, así que ¿qué significa exactamente que el functor tenga un “estado”?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El término “estado” en el contexto de los funtores en C++ se refiere a la capacidad de un functor de mantener un estado persistente entre las llamadas a funciones. En otras palabras, un functor puede recordar y acceder a los datos que se le han pasado previamente, mientras que una función regular no puede.

    En el código que proporcionaste, la clase MyFuncPtr actúa como un functor porque tiene una función operator() sobrecargada. Esta función toma un entero b y lo suma al entero a, que es una variable miembro de la clase. La variable a guarda el estado del functor, el cual se establece al construir el objeto MyFuncPtr.

    Cuando llamas a obj(15) en el objeto MyFuncPtr, el valor a de 5 se suma al valor b de 15, resultando en un valor de retorno de 20. Este mismo comportamiento podría lograrse con una función regular, como se muestra en la función miembro sum que realiza el mismo cálculo. Sin embargo, la función sum no tiene un estado persistente, solo tiene acceso al valor a cuando se llama.

    Entonces, esencialmente, el estado de un functor le permite tener conocimiento y acceso a datos que no se pasan como parámetro, lo que lo convierte en una herramienta útil para ciertas tareas de programación.

Comments are closed.