Программирование >>  Инициализация объектов класса, структура 

1 ... 169 170 171 [ 172 ] 173 174 175 ... 395


----user.C----

#include <primer.h> #include user.h

специазация для cplusplus primer::min() имя специализации квалифицируется namespace {

template<> SmallInt cplusplus primer::

min<smallInt>( SmallInt* array, int size )

{ /* ... */ } ...

Если вы, пользуясь библиотекой, содержащей определения шаблонов, захотите написать их специализации, то должны будете удостовериться, что их определения помещены в то же пространство имен, что и определения исходных шаблонов.

Упражнение 10.15

Поместим содержимое заголовочного файла <exercise.h> из упражнения 10.14 в пространство имен cplusplus primer. Как надо изменить функцию main() , чтобы она могла конкретизировать шаблон max() , находящийся в cplusplus primer?

Упражнение 10.16

Снова обращаясь к упражнению 10.14, предположим, что содержимое заголовочного файла <exercise.h> помещено в пространство имен cplusplus primer. Допустим, мы хотим специализировать шаблон функции max() для массивов объектов класса LongDouble. Нужно, чтобы специализация шаблона использовала функцию

функция сравнения объектов класса LongDouble возвращает true, если parm1 больше parm2 bool compareGreater( const LongDouble &parm1,

compareGreater() для сравнения двух объектов класса LongDouble, объявленную как:

const LongDouble &parm2 );

class LongDouble {

public:

T inn.

LongDouble(double dval) : value(ival) friend bool compareGreater( const LongDouble &,

const LongDouble & );

private:

double value;

Определение класса LongDouble выглядит следующим образом: };

Напишите определение функции compareGreater() и специализацию max() , в которой эта функция используется. Напишите также функцию main() , которая задает элементы массива ad, а затем вызывает специализацию max() , доставляющую его максимальный элемент. Значения, которыми инициализируется массив ad, должны быть получены чтением из стандартного ввода cin.



template <class elemType>

void sort( Array<elemType> &array, int low, int high ) {

if ( low < high ) { int lo = low; int hi = high + 1; elemType elem = array[lo];

for (;;) {

while ( min( array[++lo], elem ) != elem && lo < high while ( min( array[-hi], elem ) == elem && hi > low )

if (lo < hi) else

wap( array, lo, hi ); break;

swap( array, low, hi ); sort( array, low, hi-1 ); sort( array, hi+1, high );

Шаблон функции sort () для шаблона класса Array определен следующим образом:

В sort() используются две вспомогательные функции: min() и swap() . Обе они должны определяться как шаблоны, чтобы иметь возможность обрабатывать любые типы фактических аргументов, с которыми может быть конкретизирован шаблон sort() . min() определена как шаблон функции для поиска минимального из двух значений

template <class Type>

Type min( Type a, Type b ) {

return a < b ? a : b;

любого типа:

swap() - шаблон функции для перестановки двух элементов массива любого типа:

10.11. Пример шаблона функции

В этом разделе приводится пример, показывающий, как можно определять и использовать шаблоны функций. Здесь определяется шаблон sort(), который затем применяется для сортировки элементов массива. Сам массив представлен шаблоном класса Array (см. раздел 2.5). Таким образом, шаблоном sort() можно пользоваться для сортировки массивов элементов любого типа.

В главе 6 м1 видели, что в стандартной библиотеке C++ определен контейнерный тип vector, который ведет себя во многом аналогично типу Array. В главе 12 рассматриваются обобщенные алгоритмы, способные манипулировать контейнерами, описанными в главе 6. Один из таких алгоритмов, sort() , служит для сортировки содержимого вектора. В этом разделе мы определим собственный обобщенный алгоритм sort() для манипулирования классом Array, упрощенной версии алгоритма из стандартной библиотеки C++.



template <class elemType>

void swap( Array<elemType> &array, int i, int j )

elemType tmp = array[ i ]; array[ i ] = array[ j array[ j ] = tmp;

Убедиться в том, что функция sort() действительно работает, можно с помощью отображения содержимого массива после сортировки. Поскольку функция display() должна обрабатывать любой массив, конкретизированный из шаблона класса Array, ее

#include <iostream>

template <class elemType>

void display( Array<elemType> &array ) { формат отображения: < 0 1 2 3 4 5 >

cout << < ;

for ( int ix = 0; ix < array.size(); ++ix )

cout << array[ix] << ; cout << >\n ;

тоже следует определить как шаблон:

В этом примере м1 пользуемся моделью компиляции с включением и помещаем шаблоны всех функций в заголовочный файл Array.h вслед за объявлением шаблона класса Array.

Следующий шаг - написание функции для тестирования этих шаблонов. В sort() поочередно передаются массивы элементов типа double, типа int и массив строк. Вот текст программы:



1 ... 169 170 171 [ 172 ] 173 174 175 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика