bounded_int
V tomto úkolu vytvoříte šablonovou třídu bounded_int<from, to>
, která
reprezentuje int
, ale s rozsahem hodnot známým již během kompilace. Tímto
způsobem se například dá zaručit, že žádná operace nepřeteče (protože operace,
která by přetekla, se ani nezkompiluje).
bounded_int
podporuje základní sadu operací:
+
-
*
/
– pro jednoduchost budou podporované pouze kladné dělitele
bounded_int
být vytvořen z intu, který se nevejde do jeho rozsahu, vyhodí výjimku
bounded_int
u, do kterého se ten původní nemusí vejít)
explicit operator int()
<
, <=
, >
, >=
, ==
a !=
Pro každou operaci platí, že rozsah navráceného typu musí odpovídat rozsahu
předchozích typů po provedení dané operace1). Například pro operátor sčítání to znamená, že pokud
máme výraz auto c = a + b
, kde a
je bounded_int<a1, a2>
a b
je bounded_int<b1, b2>
, pak c
by mělo být typu
bounded_int<a1 + b1, a2 + b2>
.
Zároveň pro každou operaci platí, že pokud by mohlo dojít k přetečení nebo
k podtečení velikosti typu int
, pak se kód obsahující danou operaci
nezkompiluje.
Specificky pro relační operátory pak platí pravidlo, že pokud se dá během kompilace určit, jaký bude výsledek, pak je to kompilační chyba.
Testy a pomocné soubory jsou ke stažení
zde.
Pro zjednodušení testování tam najdete makro TESTABLE_STATIC_ASSERT
,
které použijte místo static_assert
. Tím se přesune chyba z kompilace
do běhu programu a zjednodušší se testování.
Dále tam najdete implementaci literálů pro vytváření bounded_int
o specifické hodnotě (123_bi
vytvoří bounded_int<123, 123>
s vnitřní hodnotou 123).
Tento úkol je bonusový a přesahuje rámec předmětu. To znamená, že k jeho úspěšnému splnění si budete muset sami nastudovat různé vlastnosti C++.
Doporučujeme se ale podívat na klíčové slovo constexpr, které umožňuje nechat část programu vyhodnotit během kompilace a na tzv trailing return type, který umožňuje zohlednit typ argumentu do funkce při definici návratového typu.
bounded_int