//: C05:PartialOrder2.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.
// Ukazuje částečné uspořádání šablon tříd.
#include <iostream>
using namespace std;

template<class T, class U> class C {
public:
  void f() { cout << "Základní šablona\n"; }
};

template<class U> class C<int, U> {
public:
  void f() { cout << "T == int\n"; }
};

template<class T> class C<T, double> {
public:
  void f() { cout << "U == double\n"; }
};

template<class T, class U> class C<T*, U> {
public:
  void f() { cout << "použito T*\n"; }
};

template<class T, class U> class C<T, U*> {
public:
  void f() { cout << "použito U*\n"; }
};

template<class T, class U> class C<T*, U*> {
public:
  void f() { cout << "použito T* a U*\n"; }
};

template<class T> class C<T, T> {
public:
  void f() { cout << "T == U\n"; }
};

int main() {
  C<float, int>().f();    // 1: Základní šablona
  C<int, float>().f();    // 2: T == int
  C<float, double>().f(); // 3: U == double
  C<float, float>().f();  // 4: T == U
  C<float*, float>().f(); // 5: použito T* [T je float]
  C<float, float*>().f(); // 6: použito U* [U je float]
  C<float*, int*>().f();  // 7: použito T* a U* [float,int]
  // Následující volání jsou nejednoznačná:
//   8: C<int, int>().f();
//   9: C<double, double>().f();
//  10: C<float*, float*>().f();
//  11: C<int, int*>().f();
//  12: C<int*, int*>().f();
} ///:~
