Бьерн Страуструп. Язык программирования С++ Второе дополненное издание


 Введение операций с помощью параметров шаблонного класса



Pdf көрінісі
бет160/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   156   157   158   159   160   161   162   163   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 2011

8.4.5 Введение операций с помощью параметров шаблонного класса 
Возможны ситуации, когда неявность связи между шаблонной функцией sort() и шаблонным классом 
Comparator создает трудности. Неявную связь легко упустить из виду и в то же время разобраться в ней 
может быть непросто. Кроме того, поскольку эта связь "встроена" в функцию sort(), невозможно 
использовать эту функцию для сортировки векторов одного типа, если операция сравнения рассчитана 
на другой тип (см. упражнение 3 в $$8.9). Поместив функцию sort() в класс, мы можем явно задавать 
связь с классом Comparator: 


Бьерн Страуструп.
Язык программирования С++ 
 
220 
template class Sort { 
public: 
static 
void 
sort(Vector&); 
}; 
Не хочется повторять тип элемента, и это можно не делать, если использовать typedef в шаблоне 
Comparator: 
template class Comparator { 
public: 
typedef T T; // 
определение Comparator::T 
static int lessthan(T& a, T& b) { 
return 


b; 

// 
... 
}; 
В специальном варианте для указателей на строки это определение выглядит так: 
class Comparator
public: 
typedef char* T; 
static int lessthan(T a, T b) { 
return strcmp(a,b) < 0; 

// 
... 
}; 
После этих изменений можно убрать параметр, задающий тип элемента, из класса Sort: 
template class Sort { 
public: 
static 
void 
sort(Vector&); 
}; 
Теперь можно использовать сортировку так: 
void f(Vector& vi, 
Vector
vc, 
Vector
vi2, 
Vector
vs) 

Sort< int,Comparator >::sort(vi); 
Sort< String,Comparator >:sort(vc); 
Sort< int,Comparator >::sort(vi2); 
Sort< char*,Comparator >::sort(vs); 

и определить функцию sort() следующим образом: 
template 
void Sort::sort(Vector& v) 

for (int i=0; ifor (int j=n-1; iif 
(Comp::lessthan(v[j],v[j-1])) 


temp 

v[j]; 
v[j] 

v[j-1]; 
v[j-1] 

temp; 


Последний вариант ярко демонстрирует как можно соединять в одну программу отдельные ее части
Этот пример можно еще больше упростить, если использовать класс сравнителя (Comp) в качестве 


Бьерн Страуструп.
Язык программирования С++ 
 
221 
единственного параметра шаблона. В этом случае в определениях класса Sort и функции Sort::sort() тип 
элемента будет обозначаться как Comp::T. 


Достарыңызбен бөлісу:
1   ...   156   157   158   159   160   161   162   163   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет