C++ Программирование в среде С++ Builder 5



             

Специализация шаблона функции


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

Допустим, мы хотим, чтобы шаблон Мах()из последнего примера порождал функцию для двух аргументов-строк, которая возвращала бы большую из них (в смысле алфавитного порядка). Функция Мах (char*, char*), порожденная из первого шаблона, сравнивала бы адреса строк вместо их содержимого. Поэтому нужно определить отдельную функцию Мах (char*, char*):

char *Max(char *a, char *b) {

return strcmp(a, b) > 0? а : b;

}

Когда компилятор встречает вызов какой-то функции, для его разрешения он следует такому алгоритму:

  • Сначала ищется обычная функция с соответствующими параметрами.
  • Если таковой не найдено, компилятор ищет шаблон, из которого можно было бы генерировать функцию с точным соответствием параметров.
  • Если этого сделать невозможно, компилятор вновь рассматривает обычные функции на предмет возможных преобразований типа параметров.
  • Ниже приводится полный пример, иллюстрирующий различные аспекты перегрузки и специализации шаблонов.

    Листинг 10.1. Перегрузка и специализация шаблона

    ////////////////////////////////////////////////////////

    // Functemp.cpp: Шаблоны функций.

    //

    #include <string.h>

    #include <iostream.h>

    #pragma hdrstop

    #include <condefs.h>

    // Возвращает больший из двух аргументов.

    template <class Т> Т Мах(Т а, Т b) {

    return a > b? a : b;

    }

    // Возвращает наибольший элемент массива.

    template <class Т> Т Мах(Т аrr[], size_t size) {

    Т maxVal = arr[0] ;

    for(unsigned i=l; i<size; i++)

    if (arr[i] > maxVal)

    maxVal = arr[i] ;

    return maxVal;

    }

    // Возвращает большую из двух строк.

    char *Max(char *a, char *b)

    {

    return strcmp(a, b) > 0? а : b;




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