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.07. 20:31 koszperv

Új autó jól seper

Címkék: auto cpp cpp0x

A C++0x-ben az auto kulcsszónak új értelmet adtak. Annyira, hogy a régi értelmében már nem is szabad használni. Tehát ez tilos:

auto int r;

Az új értelme az, hogy megpróbálja kitalálni milyen típust is akarunk írni. Így sok esetben helyet spórolunk meg magunknak, mivel az auto csak 4 karakter, míg a típus tipikusan hosszabb. Változó inicializálásakor az auto a típus helyett áll:

auto x = 5;
const auto *v = &x, u = 6;
auto x = {1, 2};
Megjegyzés: egy auto szó csak egyetlen típust helyettesíthet. Így a példában v és u esetén is intet jelöl. Ha 6.0 állna a végén, akkor hibát jelezne a fordító.

Szerepelhet new után is. Itt az auto automatikusan meghatározza a mögötte zárójelben lévő kifejezés típusát, és olyan objektumot hoz létre. A new egy pointert ad vissza arra az objektumra:

auto x = new auto('a');   
A szabványban nem láttam semmi arra utaló megjegyzést, hogy a zárójelben lévő kifejezést végrehajtja-e, illetve hogy mivel fogja inicializálni a memóriát. De a Visual Studioban elég egyértelműen végrehajtódik a kifejezés, és a végeredményével töltődik fel a lefoglalt terület.

Ezen felül az auto használható még az újfajta függvénydeklarációra is (ami egyébként erősen hajaz a lambda-függvények alakjára):

auto add(int a, int b) -> int
{
    return a + b;
}

Amint láthatjuk a paraméterlista után áll a visszatérési érték típusa. Itt a visszatérési értékre típusára mindig szükség van a lamba-függvényekkel ellentétben. És hogy ez az alak mire jó? Arról majd a perfect forwardingnál.

Megjegyzés: A VS2010 bétáját próbálgatva még elég sok dolgot hibának vél szerkesztés közben, és ezért aláhúzza őket. De lefordítani le tudja.

Lapzárta után érkezett: Azért az dolog nem fenékig tejfel. Egy jelentős problémáról megfeledkeztek: az autót nem lehet template paraméterként használni. Ez pedig baj. Mert hogy az újonnan bevezetett smart pointerek, shared_ptr és társai, a típust a template paraméterükbe kérik. Vagyis a kód csak hosszabb lessz: 

shared_ptr<auto> sx(new string("Hello"));
shared_ptr<string> sx(new string("Hello"));

Még valami: Bár iterátorciklusoknál nagyon jól jön az, hogy nem kell kiírni az iterátor hosszú nevét, akad egy kis gond: a begin mindig csak nem konstans iterátort ad vissza. Így ha mi konstans iterátort szeretnénk, akkor megintcsak ki kéne írni a teljes nevet. Ezért találták ki a cbegin metódust, ami csak abban különbözik a begin-től, hogy konstans iterátort ad vissza. Természetesen a párja a cend. Van belőle fordított irányba működő is: crbegin és crend. (Halmozzuk a betüket és az élvezeteket. Remélem a jövőben nem folytatják az egy szó - egy betű rövidítést.) A ciklus végén az cend és a crend felcserélhetők end-del és rend-del. Teljes kompatibilisek, amennyire én tudom.

    vector<int> vx;
    for (int i = 0; i < 10; ++i) vx.push_back(i);
    for (auto i = vx.cbegin(); i != vx.cend(); ++i)
        cout << *i << " ";
    cout << endl;
    for (auto i = vx.cbegin(); i != vx.end(); ++i)
        cout << *i << " ";
    cout << endl;
    for (auto i = vx.crbegin(); i != vx.crend(); ++i)
        cout << *i << " ";
    cout << endl;
    for (auto i = vx.crbegin(); i != vx.rend(); ++i)
        cout << *i << " ";
    cout << endl;

Szólj hozzá!

A bejegyzés trackback címe:

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

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