evet aynen oyle predicate bir parametre alan ve bool donduren bir fonsiyon veya "0 parametre alan () operatoru overload edilmis bir class" (yani functor)
pred'e gecirilen parametre sirasi gelen obje oluyor.
functor ozel bir class tipine sahip bir obje demek. o class tipinin ozelligi operator()'un overloaded olmasi. mesela
class A{
public:
bool operator()(){ return true;}
};
int main(){
A myA;
if ( myA() ){
...
}
....
}
Functorlari anlamak STL algoritmalrini ve boost kullanmanin onkosulu. Bir kavradiginiz zaman onunuzu cok acacak ve C++ kod yazma hizinizi yaklasik 10 kat artiracak
mesela
class cSoldier{
public:
...
bool mIsDead();
...
};
class cGame{
public:
...
void mManageSoldiers();
...
private:
...
std::list aSoldiers;
...
};
void cGame::mManageSoldiers(){
...
aSoldiers.erase( std::remove_if( aSoldiers.begin(), aSoldiers.end(),
std::mem_fun( &cSoldier::mIsDead ) ),
aSoldiers.end() );
...
}
buradaki mem_fun bir stl guzelligidir. orada bize bir functor classi yaratmaya yariyor. yukaridaki ilk ornekteki gibi operator()'u overload edilmis bir class yaratmis oluyor (bunu templateler sayesinde perde arkasinda yapiyor). bu yaratilmis class'in overload edilmis olan () operatorunun tek yaptigi is de cSoldier::mIsDead'i cagirmak. bunun icin bu metod oyle yaratiliyor ki, ilk parametre olarak cSoldier tipinden bir obje aliyor, ve ardindan da mIsDead ne kadar parametre aliyorsa o kadar parametre daha aliyor ve mIsDead ile ayni tipten bir deger geri donduruyor yani soyle bir kod uretiliyor arkada gibi dusunebilirsiniz:
class PerdeArkasiFunctor{
public:
bool operator()( cSoldier* i ){ return i->mIsDead(); }
};
Bu kod gercekte boyle degil tabi gercek uretilen kodun template'i daha farkli ama anlatimi kolaylastirmak icin bunu kullandim. mem_fun hakkinda daha cok bilgi icin:
http://www.sgi.com/tech/stl/mem_fun_t.html Bunlari yazarken birkez daha bir c++ tutoriali yazmak konusunda gaza geldim ama daha sirasi degil