Table of Contents

Úkol 8

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.

Zadání

Očekáváný interface listu vychází z 5. úkolu, s několika přidanými metodami

Potřebné hlavičkové soubory a testy jsou ke stažení zde.

Co odevzdat?

Protože šablony musejí být uvnitř hlaviček1), 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 <typename T>
class list {
    // ...
    const_iterator begin() const;
};
 
// ...
 
template <typename T>
typename list<T>::const_iterator list<T>::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 <functional>.

1)
Nemusejí být inline, ale je to jednodušší