atype doubleob; // 15-элементный массив double-значений

 int i;

 cout << "Массив целых чисел: ";

 for(i=0; i<10; i++) intob[i] = i;

 for(i=0; i<10; i++) cout << intob[i] << " ";

 cout << '\n';

 cout << "Массив double-значений: ";

 for(i=0; i<15; i++) doubleob[i] = (double) i/3;

 for(i=0; i<15; i++) cout << doubleob[i] << " ";

 cout << '\n';

 intob[12] = 100; // ошибка времени выполнения!

 return 0;

}

Рассмотрим внимательно template-спецификацию для класса atype. Обратите внимание на то, что аргумент size объявлен с указанием типа int. Этот параметр затем используется в теле класса atype для объявления размера массива a. Несмотря на то что в исходном коде программы член size имеет вид "переменной", его значение известно уже во время компиляции. Поэтому его можно успешно использовать для установки размера массива. Кроме того, значение "переменной" size используется для контроля выхода за границы массива в операторной функции operator[](). Обратите также внимание на то, как в функции main() создается массив целых чисел и массив значений с плавающей точкой. При этом размер каждого из них определяется вторым параметром template-спецификации.

На тип параметров, которые не представляют типы, налагаются ограничения. В этом случае разрешено использовать только целочисленные типы, указатели и ссылки. Другие типы (например, float) не допускаются. Аргументы, которые передаются параметру, не являющемуся типом, должны содержать либо целочисленную константу, либо указатель или ссылку на глобальную функцию или объект. Таким образом, эти "нетиповые" параметры следует рассматривать как константы, поскольку их значения не могут быть изменены. Например, в теле функции operator[]() следующая инструкция недопустима:

size = 10; // ошибка

Поскольку параметры-"нетипы" обрабатываются как константы, их можно использовать для установки размерности массива, что существенно облегчает жизнь программисту.

Как показывает пример создания безопасного массива, использование "нетиповых" параметров весьма расширяет сферу применения шаблонных классов. И хотя информация, передаваемая через "нетиповой" аргумент, должна быть известна во время компиляции, малость этого ограничения несравнима с достоинствами, предлагаемыми такими параметрами.

Шаблонный класс queue, представленный выше в этой главе, также выиграл бы от применения к нему "нетипового" параметра, задающего размер очереди. В качестве упражнения попробуйте усовершенствовать класс queue самостоятельно.

Использование в шаблонных классах аргументов по умолчанию

Шаблонный класс может по умолчанию определять аргумент, соответствующий обобщенному типу. Например, в результате такой template-спецификации

template

class myclass { //...

};

будет использован тип int, если при создании объекта класса myclass отсутствует задание какого-то бы то ни было типа.

Для аргументов, которые не представляют тип в template-спецификации, также разрешается задавать значений по умолчанию. Они используются в случае, если при реализации класса значение для такого аргумента явно не указано. Аргументы по умолчанию для "нетиповых" параметров задаются с помощью синтаксиса, аналогичного используемому при задании аргументов по умолчанию для параметров функций.

Рассмотрим еще одну версию класса безопасного массива, в котором используются аргументы по умолчанию как для типа данных, так и для размера массива.

// Демонстрация использования шаблонных аргументов по умолчанию.

#include

#include

using namespace std;

/* Здесь параметр AType по умолчанию принимает тип int. а параметр size по умолчанию устанавливается равным 10.

*/

template

class atype{

  AType a[size]; // Через параметр size передается размер массива.

 public:

  atype() {

   register int i;

   for(i=0; i

  }

  AType &operator[](int i);

};

// Обеспечение контроля границ для класса atype.

template

AType &atype::operator[](int i)

{

 if( i<0 || i> size-1) {

  cout << "\n Значение индекса ";

  cout << i << " за пределами границ массива.\n";

  exit(1);

 }

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги