Warning
This page is located in archive. Go to the latest version of this course pages.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
courses:b6b36pjc:ukoly:jednohubky [2018/12/01 15:34]
horenmar Autoupdate to version 9644b8b
courses:b6b36pjc:ukoly:jednohubky [2018/12/14 12:43]
jerabma7 Autoupdate to version e84192d92869
Line 206: Line 206:
 chování potřebujete virtuální polymorfismus. Jinak řečeno, budete muset chování potřebujete virtuální polymorfismus. Jinak řečeno, budete muset
 těch metod implementovat více. těch metod implementovat více.
 +
 +
 +==== 08 – Jednoduchá šablonová funkce ====
 +
 +V této jednohubce si napíšete jednoduchou šablonovou funkci ''​clamp''​.
 +Tato funkce se v C%%++%%17 stala součástí standardní knihovny, ale protože
 +v tomto předmětu používáme tento semestr stále ještě C%%++%%14, budeme ji
 +implementovat my.
 +
 +Funkce ''​clamp''​ má dvě přetížení
 +    * ''​T const& clamp(T const& value, T const& low, T const& high)''​
 +    * ''​T const& clamp(T const& value, T const& low, T const& high, Compare cmp)''​
 +
 +které vrací ''​low''​ pokud ''​value''​ je menší než ''​low'',​ ''​high''​ pokud
 +''​value''​ je větší než ''​high''​ a jinak ''​value''​. Jinak řečeno, ''​value''​
 +je omezeno do rozsahu ''​[low,​ high]''​. První overload předpokládá,​ že
 +''​T''​ je porovnatelné pomocí operátoru ''<'',​ druhý overload pak bere
 +vhodný komparátor jako 4. argument.
 +
 +Projekt s implementací a testy najdete
 +{{:​courses:​b6b36pjc:​ukoly:​tiny-08.zip|zde}}.
 +
 +Do Brute odevzdejte vaši hlavičku ''​tiny-08.hpp''​.
 +
 +=== Rady ===
 +
 +Není potřeba implementovat obě funkce stejně, můžete implementovat jednu
 +voláním druhé. K tomu se vám bude hodit obsah hlavičky
 +[[https://​en.cppreference.com/​w/​cpp/​header/​functional|functional]].
 +
 +=== Další ===
 +
 +K této jednohubce vám navíc nabízíme dvě otázky k zamyšlení:​
 +    * Pokud uživatel předá parametry ve špatném pořadí, může dostat špatný výsledek. Toto se dá opravit, pokud funkci přejmenujeme((A změníme implementaci tak, aby odpovídala novému jménu)). Jaké jméno by to bylo?
 +    * ''​const int& clamped = clamp(value,​ 0, 255);''​ může vést k chybě. K jaké? Jde to rozumně opravit?
 +
 +
 +==== 09 – Jednoduché metaprogramování ====
 +
 +V této jednohubce se naposled vrátíme k naší implementaci ''​vector''​ ze
 +cvičení. Poslední, co jsme s ním dělali, byla optimalizace metody
 +''​push_back(Iterator,​ Iterator)''​ dle typu iterátoru, kterou dostala.
 +V této jednohubce budeme podobně optimalizovat zvětšování (a kopírování)
 +vektoru v závislosti na typu, pro který je náš ''​vector''​ instanciovaný.
 +Specificky to znamená, že budeme rozlišovat 3 druhy typů,
 +  * Triviálně kopírovatelné typy
 +  * Typy, které mají přesunující přiřazení označené jako ''​noexcept''​ a nejsou triviálně kopírovatelné
 +  * Ostatní typy
 +
 +a budeme se k nim chtít chovat jinak, když budeme rozšiřovat pole uvnitř
 +vektoru. Specificky, triviálně kopírovatelné typy chceme kopírovat pomocí
 +[[https://​en.cppreference.com/​w/​cpp/​string/​byte/​memcpy|memcpy]],​
 +typy, které nejsou triviálně kopírovatelné,​ ale nemohou vyhodit výjimku
 +při přesunujícím přiřazení,​ chceme opravdu přesunout a typy, které výjimku
 +vyhodit mohou, chceme prostě zkopírovat.
 +
 +
 +Projekt s implementací a testy najdete
 +{{:​courses:​b6b36pjc:​ukoly:​tiny-09.zip|zde}}.
 +
 +Do Brute odevzdejte hlavičky ''​array.hpp'',​ ''​vector.hpp''​ a případné jiné
 +hlavičky které jste vytvořili.
 +
 +
 +**K zjištění,​ jestli je typ triviálně kopírovatelný používejte
 +''​pjc::​is_trivially_constructible''​ z ''​pjc-traits.hpp'',​ a ne
 +''​std::​is_trivially_constructible''​.**
 +
 +
 +=== Rady ===
 +
 +Pro implementaci tohoto úkolu doporučujeme použít SFINAE (viz přednáška),​
 +a ne tag dispatch, který byl použit na cvičení.
 +
 +Jestli přesunující přiřazení daného typu je noexcept se dá zjistit pomocí
 +traitu [[https://​en.cppreference.com/​w/​cpp/​types/​is_move_assignable|is_nothrow_move_assignable]]
 +ze standardní knihovny.
 +
 +=== Další ===
 +
 +Triviálně kopírovatelné typy jsou typy s triviálním kopírovacím
 +konstruktorem a přiřazením. Méně kruhově definováno,​ jsou to typy
 +u kterých je volání kopírovacích operací ekvivalentní se zkopírováním
 +jejich bitové reprezentace((Toto striktně řečeno není pravda pro typ
 +''​trivially_copyable_tracker'',​ proto jsme zavedli
 +''​pjc::​is_trivially_constructible''​ trait a specializovali ho pro tento
 +typ.)).
 +
 +Důvod, proč nechceme přesouvat typy, které mohou vyhodit výjimku je
 +poskytnutí tzv. silné záruky. Detaily jsou v přednášce "​Exception Safety",​
 +hrubý nástin pak je, že pokud dojde k chybě během zvětšování vektoru,
 +tak se silnou zárukou zůstanou původní prvky zachovány a nepřijdeme o data.
  
courses/b6b36pjc/ukoly/jednohubky.txt · Last modified: 2018/12/14 12:43 by jerabma7