return a[i];
}
int main()
{
atype
atype
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 {
Здесь параметр
■ путем явного задания как типа, так и размера массива;
■ задав явно лишь тип массива, при этом его размер по умолчанию устанавливается равным
■ вообще без задания типа и размера массива, при этом он по умолчанию будет хранить элементы типа
Использование аргументов по умолчанию (особенно типов) делает шаблонные классы еще более гибкими. Тип, используемый по умолчанию, можно предусмотреть для наиболее употребительного типа данных, позволяя при этом пользователю ваших классов задавать при необходимости нужный тип данных.
Подобно шаблонным функциям можно создавать и специализации обобщенных классов. Для этого используется конструкция
// Демонстрация специализации класса.
#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
x = a * a;
}
int getx() { return x; }
};
int main()
{
myclass
cout << "double: " << d.getx() << "\n\n";
myclass
cout << "int: " << i.getx() << "\n";
return 0;
}
При выполнении данная программа отображает такие результаты.
В теле обобщенного класса myclass.
double: 10.1
В теле специализации myclass
int: 25
В этой программе обратите особое внимание на следующую строку.
template <>
class myclass
Она уведомляет компилятор о том, что создается явная
Явная специализация классов расширяет диапазон применения обобщенных классов, поскольку она позволяет легко обрабатывать один или два специальных случая, оставляя все остальные варианты для автоматической обработки компилятором. Но если вы заметите, что у вас создается слишком много специализаций, то тогда, возможно, лучше вообще отказаться от создания шаблонного класса.
Глава 17: Обработка исключительных ситуации