cout << i;
}
void outdata(double d)
{
cout << d * 3.1416;
}
Давайте-ка снова обратимся к функции
В следующей программе содержится обобщенная версия функции
// Обобщенная версия функции myabs().
#include
using namespace std;
template
X myabs(X val)
{
return val < 0 ? -val : val;
}
int main()
{
cout << myabs(-10) << "\n"; // для типа int
cout << myabs(-10.0) << "\n"; // для типа double
cout << myabs(-10L) << "\n"; // для типа long
cout << myabs(-10.0F) << "\n"; // для типа float
return 0;
}
В качестве упражнения было бы неплохо, если бы вы попытались найти другие библиотечные функции-кандидаты для переделки их в обобщенные функции. Помните, главное здесь то, что один и тот же алгоритм должен быть применим к широкому диапазону данных.
Помимо обобщенных функций, можно также определить обобщенный класс. Для этого создается класс, в котором определяются все используемые им алгоритмы; при этом реальный тип обрабатываемых в нем данных будет задан как параметр при создании объектов этого класса.
Обобщенные классы особенно полезны в случае, когда в них используется логика, которую можно обобщить. Например, алгоритмы, которые поддерживают функционирование очереди целочисленных значений, также подходят и для очереди символов. Механизм, который обеспечивает поддержку связного списка почтовых адресов, также годится для поддержки связного списка, предназначенного для хранения данных о запчастях к автомобилям. После создания обобщенный класс сможет выполнять определенную программистом операцию (например, поддержку очереди или связного списка) для любого типа данных. Компилятор автоматически сгенерирует корректный тип объекта на основе типа, заданного при создании объекта.
Общий формат объявления обобщенного класса имеет следующий вид:
template
.
.
.
}
Здесь элемент
Создав обобщенный класс, можно создать его конкретный экземпляр, используя следующий общий формат.
имя_класса <тип> имя_объекта;
Здесь элемент
В следующей программе класс
// Демонстрация использования обобщенного класса очереди.
#include
using namespace std;
const int SIZE=100;
// Создание обобщенного класса queue.
template
class queue{
QType q[SIZE];
int sloc, rloc;
public:
queue() { sloc = rloc =0; }
void qput(QType i);
QType qget();
};