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




Перегрузка шаблонов функций *


Шаблон функции может быть перегружен. В следующем примере есть три перегруженных объявления для шаблона min():

// определение шаблона класса Array

// (см. раздел 2.4)

template <typename Type>

   class Array( /* ... */ };

// три объявления шаблона функции min()

template <typename Type>

   Type min( const Array<Type>&, int ); // #1

template <typename Type>

   Type min( const Type*, int ); // #2

template <typename Type>

   Type min( Type, Type ); // #3

Следующее определение main() иллюстрирует, как могут вызываться три объявленных таким образом функции:

#include <cmath>

int main()

{

   Array<int> iA(1024);   // конкретизация класса

   int ia[1024];

   // Type == int; min( const Array<int>&, int )

   int ival0 = min( iA, 1024 );

   // Type == int; min( const int*, int )

   int ival1 = min( ia, 1024 );

   // Type == double; min( double, double )

   double dval0 = min( sqrt( iA[0] ), sqrt( ia[0] ) );

   return 0;

}

Разумеется, тот факт, что три перегруженных шаблона функции успешно объявлены, не означает, что они могут быть также успешно вызваны. Такие шаблоны могут приводить к неоднозначности при вызове конкретизированного шаблона. Например, для следующего определения шаблона min5()

template <typename T>

   int min5( T, T ) { /* ... */ }

функция не конкретизируется по шаблону, если min5() вызывается с аргументами разных типов; при этом процесс вывода заканчивается с ошибкой, поскольку из фактических аргументов функции выводятся два разных типа для T.

int i;

unsigned int ui;

// правильно: для T выведен тип int

min5( 1024, i );

// вывод аргументов шаблона заканчивается с ошибкой:

// для T можно вывести два разных типа

min5 ( i, ui );

Для разрешения второго вызова можно было бы перегрузить min5(), допустив два различных типа аргументов:

template <typename T, typename U>

   int min5( T, U );

При следующем обращении производится конкретизация этого шаблона функции:




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