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
#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
#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
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.