Funtores en C++

¡ Tenga en cuenta que el título es Functors (Not Functions)!

Considere una función que toma solo un argumento. Sin embargo, mientras llamamos a esta función, tenemos mucha más información que nos gustaría pasar a esta función, pero no podemos, ya que solo acepta un parámetro. ¿Qué se puede hacer?

Una respuesta obvia podría ser las variables globales. Sin embargo, las buenas prácticas de codificación no recomiendan el uso de variables globales y dicen que deben usarse solo cuando no hay otra alternativa.

Los funtores son objetos que se pueden tratar como si fueran una función o un puntero de función. Los funtores se usan más comúnmente junto con STL en un escenario como el siguiente:

El siguiente programa usa transform() en STL para agregar 1 a todos los elementos de arr[].

// A C++ program uses transform() in STL to add 
// 1 to all elements of arr[]
#include <bits/stdc++.h>
using namespace std;
   
int increment(int x) {  return (x+1); }
   
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr)/sizeof(arr[0]);
   
    // Apply increment to all elements of
    // arr[] and store the modified elements
    // back in arr[]
    transform(arr, arr+n, arr, increment);
   
    for (int i=0; i<n; i++)
        cout << arr[i] <<" ";
   
    return 0;
}

Producción:

2 3 4 5 6

Este fragmento de código agrega solo un valor al contenido de arr[]. Ahora supongamos que queremos agregar 5 al contenido de arr[].

¿Ves lo que está pasando? Como transform requiere una función unaria (una función que toma solo un argumento) para una array, no podemos pasar un número a increment(). Y esto, en efecto, nos haría escribir varias funciones diferentes para sumar cada número. Que desastre. Aquí es donde entran en uso los funtores.

Un funtor (u objeto de función) es una clase de C++ que actúa como una función. Los funtores se llaman utilizando la misma sintaxis de llamada de función anterior. Para crear un functor, creamos un objeto que sobrecarga el operator() .

The line,
MyFunctor(10);

Is same as
MyFunctor.operator()(10);

Profundicemos más y comprendamos cómo se puede usar esto junto con STL.

// C++ program to demonstrate working of
// functors.
#include <bits/stdc++.h>
using namespace std;
  
// A Functor
class increment
{
private:
    int num;
public:
    increment(int n) : num(n) {  }
  
    // This operator overloading enables calling
    // operator function () on objects of increment
    int operator () (int arr_num) const {
        return num + arr_num;
    }
};
  
// Driver code
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr)/sizeof(arr[0]);
    int to_add = 5;
  
    transform(arr, arr+n, arr, increment(to_add));
  
    for (int i=0; i<n; i++)
        cout << arr[i] << " ";
}

Producción:

6 7 8 9 10

Así, aquí, Increment es un funtor, una clase de C++ que actúa como una función.


The line,
transform(arr, arr+n, arr, increment(to_add));

is the same as writing below two lines,
// Creating object of increment
increment obj(to_add); 

// Calling () on object
transform(arr, arr+n, arr, obj); 

Por lo tanto, se crea un objeto a que sobrecarga el operator() . Por lo tanto, los funtores se pueden usar de manera efectiva junto con las STL de C++.

Este artículo es una contribución de Supriya Srivatsa . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo electrónico a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *