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 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 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 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 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 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 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 std :: transzformáció (v.begin (), v.end (), v.begin () [Epsilon] (dupla d) -> kettős
ha (d 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 „=”: 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