Search
Tento úkol znovu navazuje na 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.
list
Očekáváný interface listu vychází z 5. úkolu, s několika přidanými metodami
remove_if
sort
merge
unique
true
Potřebné hlavičkové soubory a testy jsou ke stažení zde.
Protože šablony musejí být uvnitř hlaviček1), tentokrát odevzdáváte pouze hlavičku list.hpp.
list.hpp
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.
pointer
reference
typename
template <typename T> class list { // ... const_iterator begin() const; }; // ... template <typename T> typename list<T>::const_iterator list<T>::begin() const { return {head, this}; } // ...
Ř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í.
Doporučujeme se podívat na funkční objekty v hlavičce <functional>.