Параметры шаблонов

Параметрами шаблонов могут быть:

Для параметров любого типа можно указывать значения по умолчанию.

template< class T1,                    // параметр-тип
          typename T2,                 // параметр-тип
          int I,                       // параметр обычного типа
          T1 DefaultValue,             // параметр обычного типа
          template< class > class T3,  // параметр-шаблон
          class Character = char       // параметр по умолчанию
>

Параметры-типы описываются со словом class или typename -- это не имеет значения.

Для параметров обычных типов именно значение, а не тип определяет специализацию.

Пример различения специализаций по параметру обычного типа

 В данном примере у функции abs для одного и того же типа int порождается три разных специализации.

#include <iostream>

using namespace std;

template <typename T, int param = 0>
T abs(T x)
{
    static int calledTimes = 0;
    calledTimes++;
    cout << "param=" << param << "  called " << calledTimes
        << " times" << endl;
    return (x > 0) ? x : -x;
}

int main()
{
    cout << abs(-5.6) << endl;
    cout << abs<int, 0>(-5.6) << endl;

    cout << abs<int, 1>(-5.6) << endl;
    cout << abs<int, 1>(-5.6) << endl;

    cout << abs<int, 2>(-5.6) << endl;
    cout << abs<int, 2>(-5.6) << endl;
    return 0;
}
 

Параметры-шаблоны являются наиболее сложным видом параметров шаблонов и рассматриваются в профессиональной литературе по языку С++.