Warning
This page is located in archive.

Úkol 10

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ů.

Zadání

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ů.

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.

Nové testy jsou ke stažení zde.

Bonus

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ší).

Rady

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.

Užitečné hlavičky

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.

courses/a7b36pjc/ukoly/ukol_10.txt · Last modified: 2016/10/05 12:47 by horenmar