HTML

C++ programozás

Főként C++ programozásról, de lehet szó még C#, D vagy más nyelvről is.

Friss topikok

  • tormanator: A CG-shaderben megírt raytracing 106x gyorsabb, mint egy SSE-utaításokkal futó raytracing. Mindeg... (2011.09.08. 07:00) Csak párhuzamosan!
  • koszperv: @Vorbis: Szia! Köszöntlek, mint a blogom első hozzászólóját. Az enum egyébként tényleg egész haszn... (2009.12.30. 11:44) const vs define

Linkblog

2010.01.06. 00:28 koszperv

[](){}();

Igen, ez egy szabályos kifejezés C++0x-ben. Mégpedig egy üres lambda-függvény meghívását takarja. A lambda-függvények az egyik legfontosabb újítás a C++0x-ben az rvalue-referenciák és az inicializálások automatikus típusegyeztetése mellett.

Egy lambda-függvényt mindig egy [] párral kezdünk. Ebben vannak az elfogott változóink felsorolása. Az elfogás azt jelenti, hogy a külső függvény egyik lokális változóját elérhetőve tesszük a lambda-függvény számára. Ez kétféleképpen történhet meg: érték szerint, és referencia szerint. A változókat egyszerűen vesszővel elválasztva soroljuk fel a szögletes zárójelek között. Amelyik változót referencia szerint adunk át, az elé tegyünk egy & jelet. Így:

[a, &b, c]Itt az a és b értékszerint adódik át, a b referenciaszerint. Mivel a lambda-függvény valójában egy teljesen szabályos functor objektum, ezek a változók a tagváltozói lesznek. Ha nem akarunk vacakolni a felsorolással, használhatjuk az = és a & szimbólumokat is automatikus elfogáshoz. Az = minden nem felsorolt változót érték szerint fog el, a & minden nem felsorolt változót referencia szerint.

[&, a, c]Ez a kód az a és c változókat érték szerint fogja el, az összes többit referencia szerint. Globális változókat a lambda-függvény automatikusan látja, így azokat nem kell elfogni. Tagváltozókat pedig nem lehet, viszont a thist el lehet fogni, igaz, csak érték szerint. A = és & szimbólumok automatikusan elfogják a thist, és mindig érték szerint. Ha pedig van this, akkor ugyanúgy használhatjuk a tagváltozókat a lambda-függvényben, mint a szülőfüggvényben. Ez azt jelenti, hogy látja a private és protected tagváltozókat is!

Ezután jön a paraméterlista. Ez egy teljesen szokványos paraméterlista. Ha nincs egyetlen paraméter sem, akkor a paraméterlista a zárójeleivel együtt elhagyható. A paraméterlistát követheti a visszatérési értek típusa egy -> jelet követően. Így:

(int x, int y) -> floatA visszatérési érték típusát csak akkor kell megadni, ha több return is van a függvényben. Egyetlen return esetén a visszaadott érték típusát képes automatikusan meghatározni. Ha visszatéresi érték típusát megadjuk kötelező kitenni a paraméterlistát, még akkor is, ha az üres.

Ezután jöhet a lambda-függvény utolsó része, a kódja. Ez a szabályos függvénytörzs. Ha értéket akarunk visszaadni, akkor használhatjuk a returnt.

Ahogy már említettem, a lambda-függvény valójában egy teljesen szabályos functor. Vagyis a függvény maga a () operátor lesz benne. Ráadásu abból is a const verzió. Ez pedig azt jelenti, hogy azokat az elfogott változókat, amiket érték szerint fogtunk el, nem tudja megváltoztatni. A referencia szerint elfogottakat viszont igen. Ha mégis meg akarjuk őket változtatni, akkor a függvény törzse elé a mutable kulcsszót kell írni. Így a nem const () operátort fogja létrehozni, és a functor tagváltozói mind írhatók lesznek. Persze egy pointer által mutatott értékre nem vonatkozik a constság, így azt nyugodtan átírhatjuk mutable nélkül is. Ugyanez áll az elfogott this által mutatott tagváltozókra.

void mul(vector<int>& v, int factor)
{
    for_each(v.begin(), v.end(), [factor](int &value){value *= factor;});
}
Ez a kód példáulk megszorozza egy vektor összes elemét factorral.

 

Szólj hozzá!

A bejegyzés trackback címe:

https://progcpp.blog.hu/api/trackback/id/tr441650555

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása