return a[i];

}

int main()

{

 atype intarray; /* 100-элементный массив целых чисел */

 atype doublearray; /* 10-элементный массив double-значений (размер массива установлен по умолчанию) */

 atype<> defarray; /* 10-элементный массив int-значений (размер и тип int установлены по умолчанию) */

 int i;

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

 for(i=0; i<100; i++ ) intarray[i] = i;

 for(i=0; i<100; i++) cout << intarray[i] << " ";

 cout << '\n';

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

 for(i=0; i<10; i++) doublearray[i] = (double) i/3;

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

 cout << '\n';

 cout << "Массив по умолчанию: ";

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

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

 cout << '\n';

 return 0;

}

Обратите особое внимание на эту строку:

template

class atype {

Здесь параметр AType по умолчанию заменяется типом int, а параметр size по умолчанию устанавливается равным числу 10. Как показано в этой программе, объекты класса atype можно создать тремя способами:

■ путем явного задания как типа, так и размера массива;

■ задав явно лишь тип массива, при этом его размер по умолчанию устанавливается равным 10 элементам;

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

Использование аргументов по умолчанию (особенно типов) делает шаблонные классы еще более гибкими. Тип, используемый по умолчанию, можно предусмотреть для наиболее употребительного типа данных, позволяя при этом пользователю ваших классов задавать при необходимости нужный тип данных.

Явно задаваемые специализации классов

Подобно шаблонным функциям можно создавать и специализации обобщенных классов. Для этого используется конструкция template<>, которая работает по аналогии с явно задаваемыми специализациями функций. Рассмотрим пример.

// Демонстрация специализации класса.

#include

using namespace std;

template

class myclass {

  T x;

 public:

  myclass(T a) {

   cout << "В теле обобщенного класса myclass.\n";

   x = a;

  }

  T getx() { return x; }

};

// Явная специализация для типа int.

template <>

class myclass {

  int x;

 public:

  myclass(int a) {

   cout << "В теле специализации myclass.\n";

   x = a * a;

  }

  int getx() { return x; }

};

int main()

{

 myclass d(10.1);

 cout << "double: " << d.getx() << "\n\n";

 myclass i(5);

 cout << "int: " << i.getx() << "\n";

 return 0;

}

При выполнении данная программа отображает такие результаты.

В теле обобщенного класса myclass.

double: 10.1

В теле специализации myclass.

int: 25

В этой программе обратите особое внимание на следующую строку.

template <>

class myclass {

Она уведомляет компилятор о том, что создается явная int-специализация класса myclass. Тот же синтаксис используется и для любого другого типа специализации класса.

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

<p id="chapter 17">Глава 17: Обработка исключительных ситуации</p>
Перейти на страницу:

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

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