Бьерн Страуструп.
Язык программирования С++
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
a
<
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]))
{
T
temp
=
v[j];
v[j]
=
v[j-1];
v[j-1]
=
temp;
}
}
Последний вариант ярко демонстрирует как можно соединять в одну программу отдельные ее части.
Этот пример можно еще больше упростить, если использовать класс сравнителя (Comp) в качестве
Бьерн Страуструп.
Язык программирования С++
221
единственного параметра шаблона. В этом случае в определениях класса Sort и функции Sort::sort() тип
элемента будет обозначаться как Comp::T.
Достарыңызбен бөлісу: