Кратко

Значения параметров шаблона по умолчанию в C++ позволяют задавать типы или значения для шаблонных параметров, которые будут использоваться, если их не указать явно при инстанцировании шаблона.


Основные особенности

Что такое значения параметров шаблона по умолчанию?

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

Применение к шаблонам классов и функций

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

Примеры

Пример 1: Шаблон класса с параметром по умолчанию

template<typename T = int>
class MyClass {
public:
    MyClass(T value) : value(value) {}
    void display() const {
        std::cout << value << std::endl;
    }
private:
    T value;
};
 
int main() {
    MyClass<> defaultObj(10);     // Используется тип int по умолчанию
    defaultObj.display();         // Вывод: 10
 
    MyClass<double> doubleObj(3.14); // Явное указание типа double
    doubleObj.display();             // Вывод: 3.14
 
    return 0;
}

Пример 2: Шаблон функции с параметром по умолчанию

template<typename T = double>
void printValue(T value) {
    std::cout << value << std::endl;
}
 
int main() {
    printValue(5);          // Используется тип double по умолчанию, вывод: 5.0
    printValue<int>(5);     // Явное указание типа int, вывод: 5
    printValue(3.14);       // Используется тип double по умолчанию, вывод: 3.14
 
    return 0;
}

Пример 3: Несколько параметров шаблона с значениями по умолчанию

template<typename T1 = int, typename T2 = double>
class Pair {
public:
    Pair(T1 first, T2 second) : first(first), second(second) {}
    void display() const {
        std::cout << first << ", " << second << std::endl;
    }
private:
    T1 first;
    T2 second;
};
 
int main() {
    Pair<> defaultPair(1, 2.5);      // Используются типы int и double по умолчанию
    defaultPair.display();           // Вывод: 1, 2.5
 
    Pair<int, int> intPair(1, 2);    // Явное указание обоих типов как int
    intPair.display();               // Вывод: 1, 2
 
    Pair<float, float> floatPair(1.1f, 2.2f);  // Явное указание обоих типов как float
    floatPair.display();                       // Вывод: 1.1, 2.2
 
    return 0;
}

Правила и ограничения

Правило 1: Последовательность параметров по умолчанию

Параметры по умолчанию должны быть заданы с конца списка параметров. Нельзя задавать значение по умолчанию для параметра, за которым следует параметр без значения по умолчанию.

template<typename T1 = int, typename T2> // Ошибка: T2 не имеет значения по умолчанию
class MyClass;

Правило 2: Явное указание типов

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

template<typename T1 = int, typename T2 = double, typename T3 = char>
class Triple;
 
Triple<> obj1;                  // T1 = int, T2 = double, T3 = char
Triple<float> obj2;             // T1 = float, T2 = double, T3 = char
Triple<float, int> obj3;        // T1 = float, T2 = int, T3 = char

Пример 4: Значения параметров шаблона по умолчанию для функций

template<typename T = int>
T multiply(T a, T b) {
    return a * b;
}
 
int main() {
    std::cout << multiply(3, 4) << std::endl;         // Используется тип int по умолчанию, вывод: 12
    std::cout << multiply<double>(3.5, 2.0) << std::endl; // Явное указание типа double, вывод: 7.0
    return 0;
}

Заключение

Значения параметров шаблона по умолчанию делают использование шаблонов более гибким и удобным. Они позволяют разработчикам опускать указание типов в большинстве случаев, сохраняя возможность явно задавать необходимые типы, когда это требуется.