С++ для начинающих




Вывод аргументов шаблона * - часть 2


template <class Type>

   // первый параметр имеет тип Type*

   Type min2( Type* array, int size )

{

   Type min_val = array[0];

   for ( int i = 1; i < size; ++i )

      if ( array[i] < min_val )

         min_val = array[i];

   return min_val;

}

min2() можно вызвать, передав в качестве первого аргумента массив из четырех int, как в следующем примере:

int ai[4] = { 12, 8, 73, 45 };

int main() {

   int size = sizeof (ai) / sizeof (ai[0]);

   // правильно: преобразование массива в указатель

   min2( ai, size );

}

Фактический аргумент функции ai имеет тип “массив из четырех int” и не совпадает с типом соответствующего формального параметра Type*. Однако, поскольку преобразование массива в указатель допустимо, то аргумент ai приводится к типу int* еще до вывода аргумента шаблона Type, для которого затем выводится тип int, и шаблон конкретизирует функцию min2(int*, int).

Преобразование спецификаторов добавляет const или volatile к указателям (такие трансформации также рассматривались в разделе 9.3). Для иллюстрации влияния преобразования спецификаторов на вывод аргументов шаблона рассмотрим min3() с первым параметром функции типа const Type*:

template <class Type>

   // первый параметр имеет тип const Type*

   Type min3( const Type* array, int size ) {

   // ...

}

min3() можно вызвать, передав int* в качестве первого фактического аргумента, как в следующем примере:

int *pi = &ai;

// правильно: приведение спецификаторов к типу const int*

int i = min3( pi, 4 );

Фактический аргумент функции pi имеет тип “указатель на int” и не совпадает с типом формального параметра const Type*. Однако, поскольку преобразование спецификаторов допустимо, то он приводится к типу const int* еще до вывода аргумента шаблона Type, для которого затем выводится тип int, и шаблон конкретизирует функцию min3(const int*, int).

Теперь обратимся к преобразованию в базовый класс, конкретизированный из шаблона класса. Вывод аргументов шаблона можно выполнить, если тип формального параметра функции является таким шаблоном, а фактический аргумент – базовый класс, конкретизированный из него. Чтобы проиллюстрировать такое преобразование, рассмотрим новый шаблон функции min4() с параметром типа Array<Type>&, где Array – это шаблон класса, определенный в разделе 2.5. (В главе 16 шаблоны классов обсуждаются во всех деталях.)




Содержание  Назад  Вперед