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


Явная специализация шаблона А - часть 2


#include <iostream>

 

// здесь должно быть определение шаблона функции max()

// и его специализации для аргументов const char*

 

int main() {

   // вызов конкретизированной функции: int max< int >( int, int );

   int i = max( 10, 5 );

 

   // вызов явной специализации:

   // const char* max< const char* >( const char*, const char* );

   const char *p = max( "hello", "world" );

 

   cout << "i: " << i << " p: " << p << endl;

   return 0;

}

Можно объявлять явную специализацию шаблона функции, не определяя ее. Например, для функции max(const char*, const char*) она объявляется так:

// объявление явной специализации шаблона функции

template< > PCC max< PCC >( PCC, PCC );

При объявлении или определении явной специализации шаблона функции нельзя опускать слово template и следующую за ним пару скобок <>. Кроме того, в объявлении специализации обязательно должен быть список параметров функции:

// ошибка: неправильные объявления специализации

 

// отсутствует template<>

PCC max< PCC >( PCC, PCC );

 

// отсутствует список параметров

template<> PCC max< PCC >;

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

// правильно: аргумент шаблона const char* выводится из типов параметров

template<> PCC max( PCC, PCC );

В следующем примере шаблон функции sum()

явно специализирован:

template <class T1, class T2, class T3>

   T1 sum( T2 op1, T3 op2 );

 

// объявления явных специализаций

 

// ошибка: аргумент шаблона для T1 не может быть выведен;

// он должен быть задан явно

template<> double sum( float, float );

 

// правильно: аргумент для T1 задан явно,

// T2 и T3 выводятся и оказываются равными float

template<> double sum<double>( float, float );

 

// правильно: все аргументы заданы явно

<


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



Книжный магазин