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