Простой шаблон класса HoldsPair
Пришло время дальнейшего усовершенствования версии шаблона H o ld s P a ir . Рассмо трим листинг 14.4.
ЛИСТИНГ 14.4. Шаблон класса с двумя атрибутами
// Объявление типов по умолчанию для параметров. // Первый int, второй float
template ctypename Tl=int, typename T2=double>
2 : class HoldsPair
{
private:
T1 Valuel;
6 :T2 Value2;
7: public:
8 : // Конструктор, инициализирующий переменные-члены
9: HoldsPair (const T1& valuel, const T2& value2)
10: {
1 1 : Valuel = valuel;
1 2 : Value2 = value2;
};
// Функции доступа
const T1 & GetFirstValue () const
{
return Valuel;
}; -
2 0 :
|
const T2& GetSecondValue () const
|
2 1 :
|
2 2 :
|
{
|
return Value2;
};
#include
using namespace std;
int main ()
{
// Создание двух экземпляров шаблона HoldsPair
HoldsPair <> mlntFloatPair (300, 10.09);
HoldsPair mShortStringPair(25, \
"Learn templates, love C++");
35;
// Вывод значений, содержащихся в первом объекте...
cout « "The first object contains -" « endl;
cout « "Value 1: " « mlntFloatPair.GetFirstValue () « endl;
39:
|
cout «
|
"Value 2: " « mlntFloatPair.GetSecondValue () « endl;
|
40:
|
|
|
// Вьгоод значений, содержащихся во втором объекте...
cout « "The second object contains -" « endl;
cout « "Value 1: " « mShortStringPair.GetFirstValue () « endl;
44: cout « "Value 2: " « mShortStringPair.GetSecondValue ()
endl;
45:
return 0;
}
368 ЗАНЯТИЕ 14. Макросы и шаблоны
Результат
The first object contains -
Value
|
1:
|
300
|
Value
|
2:
|
10.09
|
The second object contains -
|
Value
|
1:
|
25
|
Value
|
2:
|
Learn templates, love C++
|
Анализ
Эта простая программа демонстрирует объявление шаблона класса H o ld s P a ir , со держащего значения двух типов, зависящих от списка параметров шаблона. В строке 1 содержится список параметров шаблона, определяющий два параметра шаблона, Т1 и Т2, с заданными по умолчанию типами i n t и d o u b le соответственно. Функции доступа, G e tF ir s tV a lu e () и G etS ec o n d V alu e (), применяются для доступа к значениям, содер жащимся в объекте. Обратите внимание, как функции G e tF ir s tV a lu e () и G e tS e c o n d V a lu e () адаптируются для возвращения объектов соответствующих типов на основании синтаксиса создания экземпляра шаблона. Таким образом, удалось определить шаблон H o ld s P a ir , который можно многократно использовать для предоставления одинаковой логики обработки переменных различных типов. Следовательно, шаблоны обеспечивают повторное использование кода.
Шаблоны классов и статические члены
Как уже упоминалось, шаблоны — это чертежи классов, которые в свою очередь явля ются чертежами объектов. Но как функционировали бы в пределах шаблона класса ста тические атрибуты? На занятии 9, “Классы и объекты”, вы узнали, что объявление члена класса статическим позволяет совместно использовать его всем экземплярам этого класса. Это очень похоже на происходящее в шаблоне класса, но его статический член совместно используется всеми экземплярами шаблона класса с той же специализацией. Так, статиче ский член X в пределах шаблона класса Т является статическим в пределах всех экземпля ров Т, специализированных для типа i n t . Подобным же образом член X является статиче ским в пределах всех экземпляров Т, специализированных для типа d o u b le , независимо от других, специализированных для типа i n t . Другими словами, вы можете представить это как создание компилятором двух версий: X i n t — для первого и X d o u b le — для второго случая (листинг 14.5).
ЛИСТИНГ 14.5. Результат применения статических
переменных в шаблоне класса и его экземплярах____________________________________
Do'stlaringiz bilan baham: |