Lambda függvény c (szabványos 11)

Példa a lambda funkciókat C ++

Ha nem ismeri a szintaxis []. ez egy lambda funkciót.

C ++ hasznos beépített funkciók, mint a std :: for_each és std :: átalakítani. valóban szükség van, és szükséges. Sajnos, ezeknek a használata funkciók nagyon nehézkes és kényelmetlen, különösen, ha a funktorhoz hogy használja egyedülálló, hogy egy adott funkciót.







void func (std :: vector v)

std :: for_each (v.begin (), v.end (), f);

Ha egy tárgy f csak egyszer és csak egy adott helyen, akkor írj egy osztály (vagy szerkezetű, mint a példában) csak végre egy triviális kód - tiszta felesleges.

A C ++ 03, akkor hajlamos lehet arra, hogy helyezze funktorhoz közel ami az ő kódja:

void func2 (std :: vector v)

std :: for_each (v.begin (), v.end (), f);

Azonban az ilyen írást nem megengedett, mint a C ++ 03, egy ilyen funkció nem vihető át a sablont.

Egy példa a legegyszerűbb formában:

void func3 (std :: vector v)

Ebben a példában a lambda funkció - ez csak „szintaktikai cukor”, amelynek van írva névtelenül funktorhoz. Record „[]” azt jelenti, hogy a függvény nincs neve, ez a névtelen, vagy, hogy másként fogalmazva, anonim. Ahelyett, hogy „[]” lehet mentálisan neve helyett „bezymyannayaFunktsiya”, és gondolni, hogy így: a hívása lesz abban a pillanatban, amikor a mutató, amely egy parancsot (ha tudja, hogyan kell dolgozni a gépi kód).

Vissza típusok

A legegyszerűbb esetben a visszatérési típus a lambda funkció jelenik meg a fordító:

void func4 (std :: vector v)

std :: transzformáció (v.begin (), v.end (), v.begin ()

Azonban, amikor elkezd írni bonyolultabb lambda funkciókat fog találkozni gyorsan az esetben, ha a visszatérési típus nem lehet levezetni a fordító, például:







void func4 (std :: vector v)

std :: transzformáció (v.begin (), v.end (), v.begin ()

A fenti példában nem világos, hogy milyen típusú akarat esetén megtérülési nulla - int vagy dupla, vagy valami más.

Hogy oldja meg ezt a problémát, akkor kézzel kell megadni a visszatérési típus a lambda-értékű szintaxis használatával „-> type”:

void func4 (std :: vector v)

std :: transzformáció (v.begin (), v.end (), v.begin ()

[] (Double d) -> kettős

Azonban a lambda funkció nem csak egy névtelen függvényt nevezzük el a felhasználás helyén. Többek között, a lambda funkció használható változók a összefüggéseiben. Azaz változók ugyanabban az összefüggésben, ahol a leírt lambda elérhető funkciók a lambda funkció. Ez az úgynevezett „kör”.

Egy idézet a Wikipedia:

Circuit (angol bezárását.) Programozás - funkciót. akinek a testét utalásokat tartalmaz változókat, amelyek a bejelentett testén kívül a funkció, és nem mint a paramétereket (mint a környező kód). Nyelvet beszélő másik áramkör - olyan funkció, amely utal a szabad változók összefüggéseiben.

Ha azt szeretnénk, hogy hozzáférjen külső változókat lambda funkció, akkor használja a „[]”, amelyben meg kell adnia a külső változó markolat, amelyet fel lehet használni benne egy lambda funkció:

void func5 (std :: vector v, const kettős epszilon)

std :: transzformáció (v.begin (), v.end (), v.begin ()

[Epsilon] (dupla d) -> kettős

ha (d Ebben a példában, ott van a változó epszilon. amely kívül van a lambda funkció. Ő készített és használt funkció. Megadhatja a több rögzített változók, vesszővel elválasztva.

Ezen felül, akkor elfog nem csak a változó. Akkor elfog a kapcsolatot a változó. Amellett, hogy a nevét elfogott változók megadhatja a „szabály az capture” oboznachamye „” és „=”:

  • [Epsilon] - elfog egy változó referencia;
  • [, Epsilon] - azt mutatja, hogy az alapértelmezett változó rögzítési lépnek fel a kapcsolatot;
  • [= epszilon] - azt mutatja, hogy az alapértelmezett változó befogó fog bekövetkezni az érték, de változó epszilon befogó kell végezni hivatkozással;
  • [X, y] - befogják a X változó értéke által, és az Y változó referenciaként.

A következő mondat túl van a megértés:

A generált operátor () const az alapértelmezés, ami azzal jár, hogy a befogási lesz const ha elérheti őket az alapértelmezett. Ennek az a hatása, hogy minden hívás az azonos bemeneti ugyanaz lesz az eredmény azonban akkor jelöljük ki a lambda mint változékony kérheti, hogy az üzemeltető (), hogy az előállított nem const.




Kapcsolódó cikkek