Exemplu de funcțiile lambda în C ++
Dacă nu sunteți familiarizați cu sintaxa []. este o funcție lambda.
C ++ oferă funcții utile încorporate, cum ar fi std :: for_each si std :: transformare. sunt într-adevăr necesare și necesare. Din păcate, utilizarea acestor funcții este foarte greoaie și incomodă, mai ales în cazul în care functorul pe care îl utilizați este unic pentru o anumită funcție.
void func (std :: vector std :: for_each (v.begin (), v.end (), f); Dacă utilizați un obiect f doar o singură dată și doar într-o anumită locație, apoi a scrie o clasă (sau structură ca în exemplu) doar pentru a efectua un cod banal - un exces clar. În C ++ 03, s-ar putea fi tentat să plaseze functor aproape de a provoca codul său: void func2 (std :: vector std :: for_each (v.begin (), v.end (), f); Cu toate acestea, o astfel de scriere nu este permisă, la fel ca în C ++ 03, o astfel de funcție nu poate fi transferată la șablon. Un exemplu în forma sa cea mai simplă: void func3 (std :: vector În acest exemplu, funcția lambda - aceasta este doar „zahăr sintactică“, prin care este scris anonim functor. Record „[]“ înseamnă că funcția nu are nume, este anonim, sau, pentru a pus un alt mod, anonim. În loc de „[]“ poate fi mental substitui numele de „bezymyannayaFunktsiya“ și să se gândească la asta în felul acesta: apelul ei se va face în momentul în care este vorba de un pointer la o comandă (dacă știi cum să lucreze codul mașinii). tipuri de returnare În cele mai simple cazuri, tipul de întoarcere al funcției lambda este afișată de compilator: void func4 (std :: vector std :: transformare (v.begin (), v.end (), v.begin (), Cu toate acestea, atunci când începe să scrie mai multe funcții complexe lambda veți întâlni rapid cu cazul în care tipul de retur nu poate fi dedus de compilator, de exemplu: void func4 (std :: vector std :: transformare (v.begin (), v.end (), v.begin (), In exemplul de mai sus, nu este clar ce tip de voință, în caz de întoarcere de la zero - int sau duble, sau alte. Pentru a rezolva această problemă, puteți specifica manual tipul de retur al lambda-evaluate folosind sintaxa „-> tipul“: void func4 (std :: vector std :: transformare (v.begin (), v.end (), v.begin (), [] (D Double) -> dublu
Cu toate acestea, funcția lambda nu este doar o funcție anonimă numită de la locul lor de utilizare. Printre altele, funcția lambda poate utiliza variabile disponibile în contextul său. Variabilele Ie disponibile în același context în care funcțiile lambda descrise disponibile în cadrul funcției lambda. Aceasta se numește un „circuit“. Un citat din Wikipedia: Circuit (închidere în limba engleză.) Programarea - funcția. al cărui corp conține referiri la variabile care sunt declarate în afara corpului funcției și nu ca parametrii săi (ca în codul din jur). Vorbind o limbă alt circuit - o funcție care se referă la variabilele libere în contextul său. Dacă doriți să accesați variabile externe în cadrul funcțiilor lambda, puteți folosi expresia „[]“, în care trebuie să specificați strânsoarea variabilă externă, care poate fi utilizat în interiorul unei funcții lambda: void func5 (std :: vector std :: transformare (v.begin (), v.end (), v.begin (), [Epsilon] (d double) -> dublu
if (d În plus, puteți captura nu numai variabila. Puteți captura link-ul de la variabila. În plus față de numele variabilelor capturate, puteți specifica „regula de captare“ oboznachamye „“ și „=“: Următoarea propoziție este dincolo de înțelegerea mea: Operatorul generat () este const în mod implicit, cu implicația care capteaza va fi Const atunci când le accesați în mod implicit. Acest lucru are ca efect faptul că fiecare apel cu aceeași intrare ar produce același rezultat, cu toate acestea puteți marca lambda ca mutabil să solicite operatorului (), care este produsă nu este Const.
articole similare