sábado, 22 de mayo de 2010

Functors en C++

Los functors se definen como 'objetos función'.
Son la evolución natural de los punteros a función de C, un ejemplo de la sintaxis para definir un functor es el siguiente.

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class PrinterFunctor{
private:
string msg;

public:
PrinterFunctor(string _msg){
msg = _msg;
}

void operator()(){
cout << msg << endl;
}
};


int main() {
PrinterFunctor pf("Printing from printer functor");
pf();

}

Para crear un functor simplemente hay que redefinir el operador (), tras eso podremos llamar al functor como si fuera una función más.

Con un functor podemos implementar una función 'resumible', es decir, una función que recuerde el estado anterior para producir el siguiente. Por ejemplo.

class PrimeGenerator{
private:
int currentPrime;

public:
PrimeGenerator(int _prime){
currentPrime = _prime;
}

bool isPrime(int n){
int root = (int) sqrt(n);

for(int i=2; i<root+1; i++){
if(n%i==0) return false;
}

return true;
}

int operator()(){
int n = currentPrime;

while(1){
n++;
if(isPrime(n)){
currentPrime = n;
return currentPrime;
}
}
}
};

Esta clase devolverá el siguiente número primo cada vez que la llamemos, si hacemos lo siguiente generará los 100 primeros números primos empezando por 5.

int main() {
PrimeGenerator primeGenerator(5);
for(int i=0; i<100; i++){
cout << primeGenerator() << endl;
}
}

0 comentarios: