===== Ú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í {{:courses:a7b36pjc:ukoly:small10.zip|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 [[http://en.cppreference.com/w/cpp/language/sfinae|SFINAE]]. ==== Užitečné hlavičky ==== Pro implementaci základního úkolu se vám bude hodit hlavička [[http://en.cppreference.com/w/cpp/header/iterator|]] obsahující typy pro tag dispatch na základě typu iterátorů. Pro implementaci bonusu doporučujeme rozhlédnout se po hlavičce [[http://en.cppreference.com/w/cpp/header/type_traits|]] a napsat si vlastní traity ke zjednodušenní výsledné implementace.