Язык программирования C++. Вводный курс


Использование шаблонов - часть 2


параметр elemType

заменяется на реальный тип при каждом использовании, как показано в примере:

#include <iostream>

#include "Array.h"

 

int main()

{

  const int array_size = 4;

 

  // elemType заменяется на int

  Array<int> ia(array_size);

 

  // elemType заменяется на double

  Array<double> da(array_size);

 

  // elemType заменяется на char

  Array<char> ca(array_size);

 

  int ix;

 

  for ( ix = 0; ix < array_size; ++ix ) {

          ia[ix] = ix;

          da[ix] = ix * 1.75;

          ca[ix] = ix + 'a';

  }

 

  for ( ix = 0; ix < array_size; ++ix )

          cout << "[ " << ix << " ]  ia: "  << ia[ix]

              << "\tca: " << ca[ix]

              << "\tda: " << da[ix] << endl;

 

  return 0;

}

Здесь определены три экземпляра класса Array:

Array<int> ia(array_size);

Array<double> da(array_size);

Array<char> ca(array_size);

Что делает компилятор, встретив такое объявление? Подставляет текст шаблона Array, заменяя параметр elemType на тот тип, который указан в каждом конкретном случае. Следовательно, объявления членов приобретают в первом случае такой вид:

// Array<int> ia(array_size);

int _size;

int *_ia;

Заметим, что это в точности соответствует определению массива IntArray.

Для оставшихся двух случаев мы получим следующий код:

// Array<double> da(array_size);

int     _size;

double *_ia;

 

// Array<char> ca(array_size);

int   _size;

char *_ia;

Что происходит с функциями-членами? В них тоже тип-параметр elemType заменяется на реальный тип, однако компилятор не конкретизирует те функции, которые не вызываются в каком-либо месте программы. (Подробнее об этом в разделе 16.8.)

При выполнении программа этого примера выдаст следующий результат:

[ 0 ]  ia: 0    ca: a   da: 0

[ 1 ]  ia: 1    ca: b   da: 1.75




Начало  Назад  Вперед