Mini predavanje iz TP-a
[quote=zjuric@haber]
eh, vako, ljudi moji...
imam par objasnjenja za vas, jer vidim da neki ljudi imaju nejasnoća...
jeste da bas i nije haber za duže postove, ali ne vidim da se u zadnje vrijeme ona TP stranica na FB-u nesto čita niti ažurira...
ima li koga da ovo sad slusa?
aha... evo ovako
ljude je malo bunila potpuna dedukcija kod funkcija koje primaju druge funkcije kao argumente...
uzeću na primjer count_if kao jednu od najjednostavnijih od njih...
znate kako se koristi... count_if(p1, p2, f)
ovdje sad nije toliko bitna njena implementacija...
baj d vej, ja bih njeno tijelo implementirao recimo ovako:
int brojac(0);
while(p1 != p2)
if(f(*p1++))
brojac++;
return brojac;
ali ponovo kažem, nije sad poenta u implementaciji, nego u zaglavlju...
sa djelimičnom dedukcijom, ako prihvatimo recimo da p1 i p2 moraju biti pokazivači, zaglavlje bi izgledalo ovako
template <typename Tip>
bool count_if(Tip *p1, Tip *p2, bool f(Tip))
naravno, ovo je djelimična dedukcija, jer smo rekli da su p1 i p2 pokazivači
da smo htjeli da p1 i p2 budu recimo iteratori za vektore, i ovo bi bila djelimična dedukcija:
template <typename Tip>
bool count_if(vector<Tip>::iterator p1, vector<Tip>::iterator p2, bool f(Tip))
nadam se da je do ovdje jasno...
a sada, ako hoćemo da p1 i p2 može biti bilo sta sto se koristi poput pokazivača, potpuna dedukcija je neophodna...
i sada, često me ljudi pitaju da li je ovo zaista potpuna dedukcija:
template <typename IterTip, typename ArgTip>
bool count_if(IterTip p1, IterTip p2, bool f(ArgTip))
prije nego sto dam odgovor, da prvo vidimo sta se ovim htjelo postići
ovdje su p1 i p2 nekog tipa IterTip, koji će se dedukcijom utvrditi kao pokazivač ili kao iterator, ili sta već..
da vidimo jos zasto i drugi metatip ArgTip... prosto zato sto se argument onoga na sta pokazuje p1 i p2 (tj. tip od *p1 ili *p2) ne može izvesti iz samog IterTip...
to nije sporno, mnogi studenti su to sami skontali...
međutim, ono sto je sporno je da li je ovo zaista potpuna dedukcija, da ili ne?
odgovor je i da i ne...
potpuna je po prva dva parametra (p1 i p2), ali je djelimična po f...
jer za f je ipak rečeno da je FUNKCIJA... i to ne bilo kakva... funkcija koja vraća bool kao rezultat... funkcija koja ima tačno jedan argument... doduse nije rečeno kojeg je on tipa, ali je ipak svasta nesto rečeno o f...
prije nego sto ispričam cijelu priču, treba da znate da je moj običaj da studentima prihvatim ovo kao potpunu dedukciju, posebno na prvom parcijalnom...
vi se sad pitate sta ima lose u tome da se specificira da je treći parametar funkcija... sta bi u ovom primjeru on uopće mogao biti osim funkcije?
tj. sta se uopće može pozvati prenoseći argumente unutra osim funkcije???
isto tako kao sto postoje poopćenja pokazivača koja se sintaksno koriste poput pokazivača ali NISU POKAZIVAČI (naravno, radi se o iteratorima), tako postoje i poopćenja funkcija koja se sintaksno koriste kao FUNKCIJE...
ali NISU FUNKCIJE...
dva takva poopćenja su FUNKTORI i FUNKCIONOIDI...
funktori spadaju u nesto sto se u TP-u radi, tamo negdje u 11. predavanju pred kraj...
a funkcionoidi se ne rade... iskreno rečeno, za njih sam ja prvi put čuo prije 2-3 godine...
dakle, onako napisana funkcija prihvatiće da se kao f posalje FUNKCIJA... ali neće prihvatiti recimo FUNKTOR, sto sužava njenu primjenu (zanemarite sad sto ne znate sta je funktor)...
i kako sada napraviti rjesenje koje ZAISTA JESTE POTPUNA DEDUKCIJA???
evo ovako...
template <typename IterTip, typename FunTip>
bool count_if(IterTip p1, IterTip p2, FunTip f)
sada, ako pozovemo count_if(p1, p2, f), ako je f zaista funkcija, FunTip će predstavljati tip funkcije... ako je f recimo funktor, FunTip će biti tip funktora...
e sad, koja je mana ovakvog pristupa
ista kao i uvijek kad se koristi potpuna dedukcija...
funkcija sa potpunom dedukcijom dopustiće da joj proslijedite BAŠ BILO ŠTA (i sto treba i sto ne treba)...
recimo, dozvoliće vam da napisete count_if(p1, p2, 5)...
greska neće biti odmah detektirana... jednostavno, dedukcija će zaključiti da je FunTip zapravo int (ne funkcija, ne funktor, nego bas int)
i belaj će nastati tek kada se unutar tijela pokusa POZVATI taj f poput funkcije...
naravno, greska će u tom trenutku biti detektirana... ali zakasnjelo djelovanje kao svoj rezultat dovesće zaista do MORBIDnih poruka o greskama koje će i iskusnog gurua uplasiti...
[/quote]