Выбрать главу

 return 0;

}

Эта программа генерирует такие результаты.

Объект o1 имеет тип class myclass<int>

Объект o2 имеет тип class myclass<int>

Объект o3 имеет тип class myclass<double>

Объекты o1 и o2 имеют одинаковый тип.

Объекты o1 и o3 имеют разные типы.

Как видите, несмотря на то, что два объекта являются экземплярами одного и того же шаблонного класса, если их параметризованные данные не совпадают, они не эквивалентны по типу. В этой программе объект o1 имеет тип myclass<int>, а объект o3 — тип myclass<double>. Таким образом, это объекты разного типа.

Рассмотрим еще один пример применения оператора typeid к шаблонным классам, а именно модифицированную версию программы определения геометрических фигур из предыдущего раздела. На этот раз класс figure мы сделали шаблонным.

// Шаблонная версия figure-иерархии.

#include <iostream>

#include <cstdlib>

using namespace std;

template <class T>

class figure

{

 protected:

  T x, y;

 public:

  figure(T i, T j) {

   x = i;

   у = j;

  }

  virtual T area() = 0;

};

template <class T>

class triangle : public figure<T>

{

 public:

  triangle(T i, T j) : figure<T>(i, j) {}

  T area() {

   return x * 0.5 * y;

  }

};

template <class T>

class rectangle : public figure<T>

{

 public:

  rectangle(T i, T j) : figure<T>(i, j) {}

  T area() {

   return x * y;

  }

};

template <class T>

class circle : public figure<T>

{

 public:

  circle(T i, T j=0) : figure<T>(i, j) {}

  T area() {

   return 3.14 * x * x;

  }

};

// Фабрика объектов, генерируемых из класса figure.

figure<double> *generator()

{

 switch(rand() % 3 ) {

  case 0: return new circle<double> (10.0);

  case 1: return new triangle<double>(10.1, 5.3);

  case 2: return new rectangle<double> (4.3, 5.7);

 }

 return 0;

}

int main()

{

 figure<double> *p;

 int i;

 int t=0, c=0, r=0;

 // генерируем и подсчитываем объекты

 for(i=0; i<10; i++) {

  p = generator();

  cout << "Объект имеет тип " << typeid(*p).name();

  cout << ". ";

  // учитываем объект

  if(typeid(*p) == typeid(triangle<double>)) t++;

  if(typeid(*p) == typeid(rectangle<double>)) r++;

  if(typeid(*p) == typeid(circle<double>)) c++;

  cout << "Площадь равна " << p->area() << endl;

 }

 cout << endl;

 cout << "Сгенерированы такие объекты:\n";

 cout << " треугольников: " << t << endl;

 cout << " прямоугольников: " << r << endl;

 cout << " кругов: " << с << endl;

 return 0;

}

Вот как выглядит возможный результат выполнения этой программы.

Объект имеет тип class rectangle<double>. Площадь равна 24.51

Объект имеет тип class rectangle<double>. Площадь равна 24.51

Объект имеет тип class triangle<double>. Площадь равна 26.765

Объект имеет тип class triangle<double>. Площадь равна 26.765