Przejdź do głównej zawartości

Posty

Wyświetlanie postów z 2013

Fabryka

Witam, dawno mnie tu nie było i nie mam dobrego usprawiedliwienia tego stanu rzeczy. W tym artykule przeanalizujemy wzorzec projektowy fabryka (factory, wirtualny konstruktor, metoda wytwórcza). Sprawa jest dość prosta wzorzec ten opisuje sytuacje w której proces tworzenia obiektu delegowany jest do specjalnej klasy(functora lub zwykłej funkcji lub singletona). Korzyść z takiego podejścia to scentralizowanie tworzenia skomplikowanych obiektów będących podklasami jednego ogólnego obiektu. Poniżej uogólniona implementacja metody wytwórczej: template <typename T> class Factory { public:   static Factory<T>& getInstance()   {     static Factory<T>* instance = NULL;     if(!instance)     {       std::lock_guard<std::mutex> guard( Factory<T>::factoryCreationMutex );       if(!instance)       {         instance = new Factory<T>();       }     }     return *instance;   }   T* createObject(std::stri

C++ metaprogramowanie z wykorzystaniem szablonów cz. 3

Dzisiaj omówię ostatnie z podstawowych zastosowań dla metaprogramowania. Nie przeciągając dziś będzie o „pętlach bez pętli”. W wielu przypadkach (a może i nie w aż tak wielu ale w kilku na pewno) mamy do czynienia z pętlą której ilość iteracji jest znana już w momencie kompilacji programu. W takich sytuacjach kompilator potrafi sam powielić kod zachowując odpowiedni indeks iteratora np.: for(int i=0; i<3; i++) {   func(i); } func(0); func(1); func(2);  Taki kod zadziała nieco szybciej gdyż nie ma potrzeby inkrementowania zmiennej i oraz jej alokacji dealokacji. Niestety nie mamy gwarancji że kompilator tak postąpi. Prezentowane zachowanie zależne jest od samego kompilatora jego wersji oraz wykorzystywanych optymalizacji. Aby wymusić wygenerowanie kodu przez kompii lator można skorzystać z template'ów. A oto rozwiązanie problemu void func(int i){std::cout<< i << std::endl;} template<int i, typename FuncType> class MetaInlineLoop {  publi

C++11 Variadic templates – szablony ze zmienną liczba parametrów

Witam w nowym roku. Dziś będzie o nowym elemencie szablonów czyli o szablonach ze zmienną liczbą parametrów. Ich implementacja i zachowanie różni się nieco od klasycznych szablonów. Nowa funkcjonalność pozwala na tworzenie bezpiecznych list typów. template<typename ...Ts> void variadic_template(){} Pierwszą nowością jest zastosowanie ...(wielokropka) przy określaniu typów szablonu. W ten sposób sygnalizujemy mnogość typów. Niestety nie mamy możliwości iterowania po kolejnych typach wewnątrz naszego szablonu. Ponadto taka definicja pozwala na stworzenie/wywołanie naszej szablonowej funkcji bez typów. variadic_template<>(); Aby tego uniknąć można uciec się do następującej sztuczki: template<typename T1, typename ...Ts> void variadic_template(T1 arg, Ts... args) W powyższym przykładzie jawnie wymuszamy podanie przynajmniej jednego typ dla naszej funkcji szablonowej. Jak już wspomniałem nie możemy jawnie iterować po typach przekazanych do