Warning
This page is located in archive.

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
courses:b6b36pjc:ukoly:jednohubky [2018/12/07 16:59]
richta [07 – Simulace kovariantních návratových typů s chytrými ukazately]
courses:b6b36pjc:ukoly:jednohubky [2018/12/14 12:43] (current)
jerabma7 Autoupdate to version e84192d92869
Line 184: Line 184:
  
  
-==== 07 – Simulace kovariantních návratových typů s chytrými ​ukazateli ​====+==== 07 – Simulace kovariantních návratových typů s chytrými ​ukazately ​====
  
 Jak jsme si ukazovali na cvičení, v C%%++%% nelze kombinovat kovariantní Jak jsme si ukazovali na cvičení, v C%%++%% nelze kombinovat kovariantní
-návratové typy s chytrými ​ukazateli, jako je například ''​std::​unique_ptr''​.+návratové typy s chytrými ​ukazately, jako je například ''​std::​unique_ptr''​.
 Nicméně, chytrou kombinací nevirtuálního rozhraní, schovávání,​ virtuálního Nicméně, chytrou kombinací nevirtuálního rozhraní, schovávání,​ virtuálního
 rozhraní a boilerplate,​ se dá kovariance simulovat. rozhraní a boilerplate,​ se dá kovariance simulovat.
Line 242: Line 242:
     * ''​const int& clamped = clamp(value,​ 0, 255);''​ může vést k chybě. K jaké? Jde to rozumně opravit?     * ''​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