Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Obszarprzechwytywania(capture)zawierawszelkieniezbędneobiektyzza-
kresu,dlaktóregozdefiniowanowyrażenielambda,abywykonaćobliczenia
zawartewjegotreści.Argumentyokreślająnazwyitypyparametrów,zktórymi
wyrażenielambdapowinnozostaćwywołane.Treść(body)zawierawszelkie
obliczenia,którenależywykonaćpowywołaniuwyrażenialambda.Możeono
(aleniemusi)zwrócićjakąśwartość.Kompilatorwydedukujeprototypfunkcji
napodstawiedomniemanychtypów.
Wpowyższymwywołaniualgorytmustd::count–ifwyrażenielambda
niemusiałoprzechwytywaćżadnychzmiennych.Wszystkieniezbędnedane
zawartewpojedynczymargumencienumber.Ponieważkompilatorznatyp
elementówzawartychwkontenerzex,typparametrunumberjestokreślany
słowemkluczowymauto,dziękiczemumożnagopoprawniewydedukować.
Wyrażenielambdajestwywoływanedlakażdegoelementukontenerax,który
jestprzekazywanyjakoparametrnumber.Treśćwyrażenialambdazwracawar-
tośćtruetylkowtedy,gdyliczbajestpodzielnaprzez2,więczliczanejedynie
liczbyparzyste.
WyrażenialambdanieistniejąwjęzykuCiniemożnaichwnimemu-
lować.Zakażdymrazem,gdybędzieszpotrzebowaćobiektufunkcyjnego,
musiszzadeklarowaćoddzielnąfunkcję.Pozatymniejestmożliweprzechwy-
tywanieobiektówwsposób,jakijestdostępnywwyrażeniachlambda.
Programowaniegenerycznezużyciemszablonów
Programowaniegenerycznepoleganatworzeniukodudziałającegozróżnymi
typami,zamiastnakoniecznościwielokrotnegopowtarzaniategosamego
koduprzezkopiowanieiwklejaniekażdegotypu,którychceszobsługiwać.
WjęzykuC++używaszszablonówwceluutworzeniakodugenerycznego.
Szablonyspecjalnymrodzajemparametrów,któreinformująkompilator,
byuwzględniałszerokizakresmożliwychtypów.
Byćmożeniezdajeszsobieztegosprawy,alejużużywałeśszablonów.
Wszystkiekontenerybibliotekistdlibwykorzystująszablony.Typobiektów,
przechowywanychwwiększościkontenerów,niemaznaczenia.Przykładowo
odtegotypuniezależydziałanielogikiokreślającejliczbęelementówwkon-
tenerzelubzwracającejjegopierwszyelement.
Załóżmy,żechcesznapisaćfunkcję,któradodatrzyliczbytegosamego
typu.Chciałbyśużywaćdowolnegotypudanych,któremożnadodawaćdo
siebie.WprzypadkujęzykaC++jesttoprosty,ogólnyproblemprogra-
mistyczny,którymożnarozwiązaćbezpośredniozapomocąszablonów,jak
pokazanonalistingu20.
template<typenameT>
Tadd(Tx,Ty,Tz){
returnx+y+z;
}
intmain(){
autoa=add(1,2,3);
autob=add(1L,2L,3L);
//ajesttypuint
//bjesttypulong
liiWstępdlaprogramistówC