Programování v C++

Demonstrace: Šablony

  • Dynamický vs kompilační/statický polymorfismus
  • Šablona funkce, třídy, alias, konstanta
  • Vždy v hlavičkovém souboru, instanciace (doplnění typu)
  • Polymorfismus a šablony

Cvičení: aggregator

Umístění: ./labs/10-aggregator/

Čas: 20 minut

Navrhněte a implementujte šablonu třídy která bude sčítat všechny předané hodnoty. Následuje příklad použití třídy.


Aggregator<int> numbers;
numbers += 1;
numbers += 2;
std::cout << numbers.value() << std::endl; // 3

Aggregator<std::string> strings;
strings += "a";
strings += "b";
std::cout << strings.value() << std::endl; // ab
  

Demonstrace: Šablony

  • Non-type parametry
  • Volání funkcí
  • NPRG051: Policy classes, traits, ...

Cvičení: Gumové pole

Umístění: ./labs/10-vector/

Čas: N/A

Vytvořte generické gumové pole jako kontejner, který zachovává pořadí vložených prvků. Pro vnitřní organizaci prvků využijte vektor unikátních ukazatelů (std::unique_ptr) na pole prvků. Jednotlivá pole prvků mají fixní velikost danou jako kompilační argument.

Zadání úlohy pokračuje na dalším slajdu.

Rozhraní

Řešení musí implementovat následující funkce:

  • push_back - rozumně efektivní vložení záznamu na konec
  • operator[] - pro přístup k prvku na dané pozici, std::out_of_range
  • size - vrátí počet uložených prvků
  • capacity - vrátí celkovou úložnou kapacitu

Volitelně funkce pop_back - odebere poslední prvek pokud existuje. Toto vyžaduje volání "destruktoru", což není úplně běžné, ale možné. Pro třídu Observer a proměnou instance je syntaxe: instance.~Observer();

Další požadavky

Pár dalších věcí:

  • Pamatujte na vhodné použití const a různé alternativy funkcí (const, const&, ...).
  • Zabraňte přiřazení nebo zkopírování instance FluidVector.

Protože klávesnice ...


struct Observer {
  int index;
  Observer() : index(-1) { std::cout << "ctor -1" << std::endl; }
  Observer(int index_) : index(index_) { std::cout << "ctor " << index << std::endl; }
  // Rule of five.
  Observer(const Observer& other) : index(other.index) { std::cout << "copy " << index << std::endl; }
  Observer(Observer&& other) noexcept  : index(other.index) { other.index = -1; std::cout << "move " << index << std::endl; }
  void operator=(const Observer& other) { index = other.index; std::cout << "= copy " << index << std::endl; }
  void operator=(Observer&& other) noexcept { index = other.index;  other.index = -1; std::cout << "= move " << index << std::endl; }
  ~Observer() { std::cout << "dtor " << index << std::endl; }
};