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

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í:

  • unární i binární operátor +
  • unární i binární operátor -
  • binární operátor *
  • binární operátor / – pro jednoduchost budou podporované pouze kladné dělitele
  • kontrolovaný (int) konstruktor – pokud by měl bounded_int být vytvořen z intu, který se nevejde do jeho rozsahu, vyhodí výjimku
  • kopírující konstruktor a přiřazení – zachová invariant objektu (není možné kopírovat/přiřadit do bounded_intu, do kterého se ten původní nemusí vejít)
  • explicit operator int()
  • relační operátory <, <=, >, >=, == 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).

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
courses/b6b36pjc/ukoly/bounded_int.txt · Last modified: 2017/12/12 09:25 by horenmar