Curs13 Obiecte Functii

S-ar putea să vă placă și

Sunteți pe pagina 1din 2

Obiecte funcţii (functori).

Într-o expresie, apelul unei funcţii este înlocuit prin rezultatul întors de funcţie. Misiunea funcţiei poate fi
preluată de către un obiect. În acest scop se supraîncarcă operatorul apel de funcţie sub forma function
operator()().
Obiectele aparţinând claselor care au supraîncărcat operatorul apel de funcţie sunt obiecte funcţii sau
functori.
STL prevede o serie de clase generice pentru comparaţii. Clasele comparaţii sunt funcţii binare derivate
din clasa binary_function:
template <class arg1, class arg2, class rez>
struct binary_function{
typedef arg1 first_argument_type;
typedef arg2 second_argument_type;
typedef rez result_type;
};
Pentru clase unare se defineşte şablonul unary_function. Exemplu:
template <class T>
struct equal_to : binary_function(T, T, bool){
bool operator()(const T& x, const T& y) const {
return x==y;
}
};
În acest mod sunt definiţi functorii: equal_to<T>, not_equal<T>, greater<T>, less<T>,
greater_equal(), less_equal() care asigură algoritmilor o interfaţă uniformă.
Astfel pentru a sorta un tablou cu funcţia de comparaţie mai mic în valoare absolută, vom defini:
#include <iostream>
#include <functional> // less<T>
#include <cstdlib> // abs()
struct absLess{
bool operator()(int x, int y)const{
return abs(x) < abs(y);
};
};
STL asigură, de asemenea, prin supraîncărcarea operatorului apel de funcţie, clase pentru operaţiile
aritmetice şi logice. Aceste sunt: plus<T>, minus<T>, multiplies<T>, divides<T>,
modulus<T>, negate<T>, logical_and<T>, logical_or<T>.
Afişaţi parametrii liniei de comandă, sortaţi în ordine invers-lexicografică.
#include <iostream>
#include <functional>
#include <string>
#include <algorithm>
using namespace std;
void main(int ac, char** av){
sort(av, av+ac, greater_equal<string>());
for(int i=0; i<ac; i++)
cout << av[i] << ” ”;
cout << endl;
}

Functori adaptori.
Sunt obiecte funcţii care cooperează cu alte obiecte funcţii pentru a le adapta la cerinţe diferite.
not1 – are ca parametru un functor predicat unar şi întoarce opusul lui. Exemplu:

1
struct impar : public unary_function<int, bool>{
bool operator()(int x)const{
return x % 2 != 0;
};
};
. . .
int a;
cin >> a;
if(not1(impar()(a)))
cout << a << ” este par\n”;
. . .
not2 – are ca parametru un functor predicat binar şi întoarce opusul lui.
bind1st, bind2nd – transformă un functor predicat binar, în functor predicat unar, legând unul din argumente
de o valoare dată ca parametru. De exemplu functorul less<T> compară două valori. Dacă fixăm primul
argument (de exemplu la valoarea 100), se generează un functor unar.
// gaseste primul element care nu este < 100
find_if(v.begin(),v.end(),bind1st(less<int>(),100));
// gaseste primul element < 100
find_if(v.begin(),v.end(),bind2nd(less<int>(),100));
ptr_fun – transformă un pointer la funcţie în functor. Pointerul la funcţie poate avea unul sau doi parametri.
#include <iostream>
#include <functional>
#include <cmath>
double (*f)(double) = sin;
void main(){
double x=3.1416;
cout << f(x) << endl;
cout << ptr_fun(f)(x) << endl;
}

S-ar putea să vă placă și