Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracowali: Piotr DejaVu Szawdyński, pekfos
Pojęcia

funktor

[pojęcie] Obiekt, który może być wywoływany jak funkcja.

Opis szczegółowy

Funktor jest to obiekt, który może zostać wywołany jak zwykła funkcja. Każda klasa, która posiada zdefiniowany operator
()
 w języku C++ może pełnić rolę funktora. Alternatywną nazwą dla funktora, którą stosuje się w informatyce jest tzw. obiekt funkcyjny.

Dodatkowe informacje

Zaletą funktora w stosunku do zwykłej funkcji jest fakt, że każdy obiekt funkcyjny może posiadać inny stan wewnętrzny bez konieczności modyfikacji kodu, który z takiego funktora korzysta.

Przykłady

Przykład funktora bezstanowego

C/C++
#include <algorithm>
#include <cstdio>

class CPorownaj
{
public:
    bool operator ()( const int & a, const int & b ) const
    {
        return a < b;
    }
};

void porownaj( int a, int b, const CPorownaj & f )
{
    printf( "%d < %d = %s\n", a, b, f( a, b ) ? "tak"
        : "nie" );
}

int main()
{
    CPorownaj funktor;
    porownaj( 10, 12, funktor );
    porownaj( 10, 10, funktor );
    porownaj( 20, 12, funktor );
    porownaj( 10, 15, funktor );
    return 0;
}
Standardowe wyjście programu:
10 < 12 = tak
10 < 10 = nie
20 < 12 = nie
10 < 15 = tak

Przykład funktora stanowego

C/C++
#include <algorithm>
#include <cstdio>

class CLiczWywolania
{
public:
    CLiczWywolania()
        : m_iMniejsze( 0 )
         , m_iWieksze( 0 )
         , m_iRowne( 0 )
    { }
    bool operator ()( const int & a, const int & b ) {
        if( a < b ) m_iMniejsze++;
       
        if( a == b ) m_iRowne++;
       
        if( a > b ) m_iWieksze++;
       
        return a < b;
    }
    void wypiszStatystyki() const {
        printf( "Liczba porownan:\n" );
        printf( "'a' mniejsze 'b': %d\n", m_iMniejsze );
        printf( "'a' rowne 'b': %d\n", m_iRowne );
        printf( "'a' wieksze 'b': %d\n", m_iWieksze );
    }
private:
    int m_iMniejsze;
    int m_iWieksze;
    int m_iRowne;
};
void porownaj( int a, int b, CLiczWywolania & f ) {
    printf( "%d < %d = %s\n", a, b, f( a, b ) ? "tak"
        : "nie" );
}
int main() {
    CLiczWywolania funktor;
    porownaj( 10, 12, funktor );
    porownaj( 10, 10, funktor );
    porownaj( 20, 12, funktor );
    porownaj( 10, 15, funktor );
    funktor.wypiszStatystyki();
    return 0;
}
Standardowe wyjście programu:
10 < 12 = tak
10 < 10 = nie
20 < 12 = nie
10 < 15 = tak
Liczba porownan:
'a' mniejsze 'b': 2
'a' rowne 'b': 1
'a' wieksze 'b': 1