Table of Contents

TMP: 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).

Zadání

bounded_int podporuje základní sadu operací:

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

Rady

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.

1)
Alespoň pokud vrací další bounded_int