//: C05:MedvediKoutek.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// Ilustruje charakterizační třídy.
#include <iostream>
#include "BearCorner.h"
using namespace std;

// Vlastní třída charakteristiky
class SmiseneCharakteristiky {
public:
  typedef Mleko napoj_t;
  typedef Med svacina_t;
};

// Šablona Host (používá charakteristiky)
template<class Host, class traits = CharakteristikyHosta<Host> >
class MedvediKoutek {
  Host navstevnik;
  typedef typename traits::napoj_t napoj_t;
  typedef typename traits::svacina_t svacina_t;
  napoj_t napoj;
  svacina_t svacina;
public:
  MedvediKoutek(const Host& g) : navstevnik(g) {}
  void pohostit() {
    cout << "Přichází " << navstevnik
         << " podává se " << napoj
         << " a " << svacina << endl;
  }
};

int main() {
  Chlapec cr;
  MedvediKoutek<Chlapec> pc1(cr);
  pc1.pohostit();
  Medvidek pb;
  MedvediKoutek<Medvidek> pc2(pb);
  pc2.pohostit();
  MedvediKoutek<Medvidek, SmiseneCharakteristiky> pc3(pb);
  pc3.pohostit();
} ///:~
