R Справочное руководство по С++

R.14.4 Шаблоны типа для функций.

   


Назад  |  Вперёд

Шаблон типа для функции определяет как будет строиться функция. Например, семейство функций sort можно описать следующим образом:

           template<class T> void sort(vector<T>);

Шаблон типа для функции порождает неограниченное множество перегруженных функций. Функция, порождаемая шаблоном типа для функций, называется шаблонной функцией. Она эквивалентна функции, в описании которой указан тип, соответствующий шаблону, см. $$R.14.5.

При вызове шаблонной функции параметры шаблона типа не задаются явно, вместо этого применяется правило разрешения неопределенности перегруженных функций. Рассмотрим пример:

           vector<complex> cv(100);
           vector<int> ci(200);

           void f(vector<complex>& cv, vector<int>& ci)
           {
             sort(cv);   // вызывается sort(vector<complex>)
             sort(ci);   // вызывается sort(vector<int>)
           }

Шаблонная функция может быть перегружена как обычными, так и шаблонными функциями с тем же именем. Для разрешения неопределенности шаблонных и обычных функций с одним и тем же именем надо последовательно пройти три шага:

Если не найдено сопоставимой функции, вызов является ошибочным. Если уже на первом шаге найдено более одного кандидата, сопоставимого с данной функцией, то вызов также считается неоднозначным и ошибочным.

Успешное выполнение шага [2] приведет к созданию некоторой шаблонной функции с параметрами ($$R.14.5), типы которых точно сопоставятся с типами параметров, указанных в вызове. В этом случае недопустимо расхождение даже за счет тривиальных преобразований ($$R.13.2).

Такие же действия применяются для сопоставления типов указателей на функции ($$R.13.3).

Рассмотрим пример:

           template<class T> T max(T a, T b) { return a>b?a:b; };

           void f(int a, int b, char c, char d)
           {
             int m1 = max(a,b);   // max(int a, int b)
             char m2 = max(c,d);  // max(char c, char b)
             int m3 = max(a,c);   // ошибка: нельзя создать max(int,char)
           }

Добавив к этому примеру описание

           int max(int,int);

можно разрешить неопределенность для третьего вызова, поскольку теперь задана функция, которая после стандартного преобразования char в int, может сопоставиться с вызовом max(a,c).

Определение шаблона типа для функции используется для создания различных вариантов шаблона типа. Для вызова определенного варианта достаточно лишь описания шаблона типа.

Каждый параметр-шаблона-типа, который приведен в списке-параметров-шаблона-типа должен обязательно использоваться при задании типов параметров в шаблоне типа для функции.

           template<class T> T* create(); //ошибка

           template<class T>
               void f() { // ошибка
                  T a;
                  // ...
               }

Все параметры-шаблона-типа, приведенные в шаблоне типа для функции, должны быть параметрами-типа.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.