niedziela, 6 lutego 2011

C++ 0x co fajnego już działa?

C++ używany jest od 1983 roku. Obecnie wciąż obowiązuje standard z 1998 (z drobnymi poprawkami z 2003), jednak od jakiegoś czasu opracowywana jest kolejna wersja standardu mającą dostosować (chociaż trochę) ten język do obecnych standardów definiowanych przez coraz bardziej (tak właściwie to co raz bardziej od co najmniej kilku lat :P) innych języków wysokopoziomowych (których nazwy każdy sobie sam po cichu dopowie).

Nowa wersja standardu aktualnie nazywana jest C++ 0x (0x jest oznaczeniem roku w którym standard miał wyjść) jednak ta nazwa przeterminowała się wraz z nadejściem 1 stycznia 2010 roku :). Jednak aby nie siać zamętu zamiast C++ 1x wciąż najczęściej stosuje się nazwę C++ 0x.

Jak już wspomniałem nowy standard jeszcze nie wszedł w życie jednak obsługę niektórych jego elementów już zostały dodane do kompilatorów. Postaram się omówić te najciekawsze (moim zdaniem) dostępne (przez dostępne rozumiem te które obsługiwane przez kompilator Microsoftu ponieważ GCC jest aktualizowany częściej i posiada znacznie lepszą obsługę nowego standardu więc wyrównuję do gorszego).

Zacznijmy od najczęściej stosowanego przeze mnie elementu, czyli typu auto. Jak można się łatwo domyśleć jest to typ automatyczny. To czego na pierwszy rzut oka nie widać (ale ze względu na naturę C++ ) to jest to typ statyczny rozstrzygany na etapie kompilacji. Idealny na długie nazwy typów zwracanych przez funkcję lub typów trudnych do odgadnięcia przez programista (przykładem są niektóre typu z biblioteki boost :P ). Przykładowy kod:
for(auto it = kontenerSTL.begin(); it != kontenerSTL.end(); ++it)
{
...
}
Z typem auto wiąże się też decltype który zwraca typ zmiennej (na przykład do rzutowania).

Kolejnym przydatnym elementem nowego standardu znane z języków funkcyjnych wyrażenia lambda. Co w nich jest fajnego? Dzięki ich istnieniu w C++ można skompilować poniższy kod:
[](){}()
Który tworzy puste wyrażenie lambda, nieprzyjmujące ani nie zwracające żadnej wartości, które jest od razu wywoływane. Pisząc krócej nie robi nic :). A tak na serio wyrażenia lambda pozwolą na wygodniejsze opisanie jednokrotnie używanych w kodzie funktorów (struktur lub klas zachowujących się jak funkcje poprzez przeciążenie operatora '()'). Oczywiście idealnie współgrają z dodaną w tej wersji standardu pętlą foreach (która tak właściwie jest funkcją szablonową :P). Składnia wyrażeń lambda przedstawia się następująco:
[przechwycenia](parametry) -> typ_zwracany { ciało funkcji }
Po kolei:
  1. Przechwycenia (captures -  nie mam pomysłu na inne tłumaczenie) - tutaj definiujemy które zmienne spoza wyrażenia lambda chcemy użyć. Zmiennych możemy użyć na zasadzie referencji (&nazwa_zmiennej) lub kopii (nazwa_zmiennej). Oczywiście są operatory domyślne '=' - wszystko jako kopia i '&' - wszystko jako referencja
  2. Parametry - parametry wyrażenia lambda definiowane jak w zwykłej funkcji.
  3. Typ zwracany  - parametr opcjonalny (kompilator jest w stanie wywnioskować zwracany typ, chociaż oczywiście nie zawsze)
  4. Ciało funkcji  - nie ma co tłumaczyć prawda :P
Ostatnio wśród programistów C++ zapanowała moda na metaprogramowanie z wykorzystaniem szablonów (co widać np. po bibliotekach boost). Z tego powodu postanowiono dodać do języka asercje statyczne które pozwalają na sprawdzanie błędów na etapie kompilacji.
static_assert(warunek, wiadomość błędu)
Jak już wspomniałem prze naturę statycznych asercji, warunek musi być możliwy do sprawdzenia na etapie kompilacji.

Z ciekawostek można dodać, że C++ wreszcie doczekał się porządnego NULLa pod postacią nullptr który w przeciwieństwie do starego NULL nie jest makrem i można go przypisać tylko do wskaźników.

Nowy standard może wejść w tym roku i oficjalnie zostanie nazwany C++ 11 wtedy w 2012 (chociaż obawiam się, że to będzie później) Microsoft wypuści kolejne Visual Studio z nową wersją kompilatora zgodną z nowym standardem (GCC standard będzie obsługiwał zapewne wcześniej) i wtedy spokojnie będzie można korzystać w pełni z udogodnień nowego standardu, który poza wymienionymi tu elementami posiada jeszcze inne równie ciekawe. Pełny opis zmian można znaleźć na Wikipedii. Ja już nie mogę się doczekać.

Brak komentarzy: