Search
V posledním úkolu si vyzkoušíte psaní vlastního algoritmu ve stylu standardní knihovny. To obnáší použití šablon pro iterátory a použití metaprogramovacích technik pro implementaci optimálního chování pro různé kategorie iterátorů.
Budete implementovat algoritmus adjacent_pair, jakožto variantu standardního algoritmu std::for_each, ale místo pro každý prvek, je předaná funkce volána pro každý sousední pár prvků.
adjacent_pair
std::for_each
Protože se optimální implementace algoritmu liší pro různé druhy iterátorů (InputIterator vs ForwardIterator a silnější), bude vaším úkolem použít TMP (template metaprogramming) k tomu, aby se vaše implementace přizpůsobila předaným iterátorům.
InputIterator
ForwardIterator
Nové testy jsou ke stažení zde.
Tento úkol nabízí možnost získat bonusové body, za použití pokročilejších metaprogramovacích technik. Chceme, aby varianta pro InputIterator neriskovala výjimky, pokud nemusí, což znamená, že pokud je přesunující operace označena jako noexcept, pak by mělo dojít k přesunu. Pokud je kopírující operace označena jako noexcept a přesunující není, pak by se měla provést kopie. Pokud mohou i přesunující i kopírující operace vyhodit výjimku, pak by mělo dojít k přesunu (a k doufání v nejlepší).
noexcept
Bodování tohoto úkolu je schválně uděláno tak, aby vám k jeho uznání stačilo minimum práce a pouze základní znalosti šablon. Doporučujeme ale vyzkoušet si získat všechny a promyslet si i bonus.
Pro implementaci bonusové části úkolu doporučujeme přečíst si více o std::enable_if a o SFINAE.
std::enable_if
Pro implementaci základního úkolu se vám bude hodit hlavička <iterator> obsahující typy pro tag dispatch na základě typu iterátorů.
Pro implementaci bonusu doporučujeme rozhlédnout se po hlavičce <type_traits> a napsat si vlastní traity ke zjednodušenní výsledné implementace.