Bez koriscenja bind bi morali da obezbedimo funkcijski objekat:
Code:
class SomeClass
{
int age() const;
};
class SortCriterion
{
public:
bool operator() (const SomeClass& p1, const SomeClass& p2) const
{
return p1.age() < p2.age();
}
};
...
std::sort(vecOfSomeClassValues.begin(), vecOfSomeClassValues.end(), SortCriterion());
Sada, ako pogledamo primer:
Code:
std::sort(
v.begin(),
v.end(),
boost::bind(std::less<int>(),
boost::bind(&personal_info::age, _1),
boost::bind(&personal_info::age, _2)
)
);
boost::bind(std::less<int>(),
boost::bind(&personal_info::age, _1),
boost::bind(&personal_info::age, _2)
)
Ovaj deo koda generise funkcijski objekat koji vraca bool rezultat (to je operator() std::less<int> funkcijskog objekta) i spoljasnji bind vezuje rezultate unutrasna dva binda za operator() std::less<int> funkcijskog objekta:
Code:
class GenerisaniSortKriterijum;
poziva se operator () i predaju se ages:
rezultat_1 = _1.age(); // generisano sa boost::bind(&personal_info::age, _1)
rezultat_2 = _2.age(); // generisano sa boost::bind(&personal_info::age, _2)
GenerisaniSortKriterijum::operator()(rezultat_1, rezultat_2) i vraca se vrednost definisana std::less<int> kriterujmom poredjenja.
( u stvari, ovo je analogno sa: std::less<int>::operator(rezultat_1, rezultat_2)
Objekte koji su predstavljeni sa _1 i _2 su delayed parametri funkcije koje sort predaje ovom nasem GenerisaniSortKriterijum kada poziva generisani predikat.
Mozda nisam objasnio na najbolji nacin ali mislim da je to ono sto se desava kada se izvrsava ovaj slozeni bind kod.
Eto sad sam i ja razumeo dok sam pisao ovo, sta se desava i tvoje objasnjenje mi je dosta pomoglo da skapiram o cemu se radi.
Mene je zanimalo to, sta ako funkcija age uzima parametar neki (mozda u ovom primeru nema smisla ali ajde da vidimo)
Code:
....
int age(bool roundToNextDecade);
....
std::sort(
v.begin(),
v.end(),
boost::bind(std::less<int>(),
boost::bind(&personal_info::age, _1, ???),
boost::bind(&personal_info::age, _2, ???)
)
);
Moguce da ovo nema nikakvog smisla i da ne moze ovako...
U svakom slucaju, mislim da sam skapirao malo bolje sada sve ovo :)
A da, mozda bi bRoundToNextDecade onda mogli da predamo nekoj hipotetickoj sort funkciji koja prosledjuje i 3. parametar i onda bi ispalo nesto ovako:
Code:
std::sort(
v.begin(),
v.end(),
boost::bind(std::less<int>(),
boost::bind(&personal_info::age, _1, _3),
boost::bind(&personal_info::age, _2, _3)
)
);
[Ovu poruku je menjao glorius dana 25.10.2013. u 18:42 GMT+1]
EOF