===== Úkol 8 ===== Tento úkol znovu navazuje na [[courses:a7b36pjc:ukoly:ukol_5|předchozí úkol s listem]], kde jsme doplnili třídu ''list'' o iterátory, swap, kopírující a přesunující operace a metody split, merge a sort. V tomto úkolu se vrátíme k této verzi listu vrátíme a rozšíříme ji o podporu šablon. ===== Zadání ===== Očekáváný interface listu vychází z 5. úkolu, s několika přidanými metodami * ''remove_if'', která bere predikát a smaže všechny prvky, pro které je predikát **pravdivý**. * ''sort'' a ''merge'' mají overload, který bere řadící predikát splňující [[https://www.sgi.com/tech/stl/StrictWeakOrdering.html|SWO]]. * ''unique'' má overload, který bere predikát vracející ''true'' pokud je jeden prvek duplikát druhého. Potřebné hlavičkové soubory a testy jsou ke stažení {{:courses:a7b36pjc:ukoly:small8.zip|zde}}. ==== Co odevzdat? ==== Protože šablony musejí být uvnitř hlaviček((Nemusejí být inline, ale je to jednodušší)), tentokrát odevzdáváte pouze hlavičku ''list.hpp''. ===== Rady ===== ==== Závislá jména ==== Pokud se rozhodnete vepsat všechny metody do těla třídy (doporučujeme), na problém s tzv. závislými jmény nenarazíte. Pokud se rozhodnete napsat metody mimo tělo třídy, na problém se závislými jmény narazíte i u všech metod listu, které vracejí iterátor (pozor, nejedná se o konstruktory) nebo ''pointer''/''reference''. Návratovou hodnotu těchto metod pak musíte uvést klíčovým slovem ''typename''. template class list { // ... const_iterator begin() const; }; // ... template typename list::const_iterator list::begin() const { return {head, this}; } // ... ==== Duplikace kódu ==== Řiďte se poučkou DRY -- Don't Repeat Yourself. V zadání jsou metody (například přetížené varianty ''sort''), které jsou prakticky identické, dají se tedy implementovat tak, že první opravdu implementujeme a druhá pak volá tu první. ==== Užitečné hlavičky ==== Doporučujeme se podívat na funkční objekty v hlavičce [[http://en.cppreference.com/w/cpp/header/functional|]].