Lect14
.pdf14.Обобщенное программирование
«Объектно-ориентированное программирование»
доцентПриваловМ.В.
Донецк,ДонНТУ,2011
1
Обобщенноепрограммирование
Обобщенноепрограммирование– это парадигмапрограммирования, заключающаясявсозданииклассови написанииалгоритмов,которые можноприменятькразличнымтипам данных.
ВООПобобщенное программированиереализуетсяза
счетпримененияшаблонов(или generics)
2
Зачемнужнообобщенное программирование?
Различныетипыданныхчасто требуетсяобрабатыватьприпомощи однихитехжеалгоритмов
Типичныевариантыприменения:
◦Сортировкаипоиск
◦Контейнерыдляпроизвольноготипа элементов
◦Программированиенаосновестратегий
3
Пример
Требуетсяразработатьсемейство функцийmaximum(a, b),
возвращающуюзначениенаибольшего изаргументовa иb
◦Аргументыa иb могутиметь произвольныйчисловой тип
int
unsigned int
double
float
◦Типрезультатадолженсовпадатьстипом аргумента
4
Решениесиспользованием
перегрузки
int maximum(int a, int b) { return (a > b) ? a : b;
}
unsigned int maximum(unsigned int a, unsigned int b)
{
return (a > b) ? a : b;
}
float maximum(float a, float b) { return (a > b) ? a : b;
}
double maximum(double a, double b) { return (a > b) ? a : b;
}
5
Недостаткиприведенного решения
Телофункцииприходитсяписать несколькораз
Усложнениепроцессавнесения измененийвреализациюфункций:
◦Ситуацияусложняется,еслиразличные экземплярыоднойитойжефункции разнесеныпоразличнымфайламили модулям
6
Лучшийвариант– использование шаблоновфункций
ЯзыкC++ имеетязыковыесредства, позволяющиеопределитьфункциюшаблон,работающуюснекоторымине известнымизаранеетипамиданных
◦Шаблонзадаетповедениецелого семействафункцийиможетбытьв дальнейшемиспользованснекоторыми конкретнымитипамиданных
Шаблонныефункциишироко
используютсядляреализации алгоритмоввбиблиотекеSTL
7
Ограничения
Реализация(исходныйкод)шаблонной функциидолжнабытьдоступнаизвсех единицкомпиляции,гдеона используется
8
Примерсшаблоном
template <class T>
T maximum(T a, T b) {
return (a > b) ? a : b;
}
int main() {
int max1 = maximum(3, 5);
float max2 = maximum(-3.7f, 0.35f) double max3 = maximum(1.2, 7.4); string max4 = maximum(string(“hello"),
string(“world")); return 0;
}
9
Примерсшаблоном
Синтаксисописанияшаблонафункции
template <class идентификатор_типа1, class идентификатор_типа2, …
class идентификатор_типаN> описание;
или
template <typename идентификатор_типа1, typename идентификатор_типа2, …
typename идентификатор_типаN> описание;
10