//: C05:BearCorner2.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 postupové třídy.
#include <iostream>
#include "BearCorner.h"
using namespace std;

// Postupové třídy (vyžadují statickou funkci doAction() ):
class Jidlo {
public:
  static const char* doAction() { return "svačí"; }
};

class Basta {
public:
  static const char* doAction() { return "cpe do sebe"; }
};

// Šablona Host (Používá charakterizační a postupovou třídu)
template<class Host, class Action,
         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 << navstevnik << " " << Action::doAction()
         << " " << napoj
         << " a " << svacina << endl;
  }
};

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