Кратко
Значения параметров шаблона по умолчанию в 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;
}
Заключение
Значения параметров шаблона по умолчанию делают использование шаблонов более гибким и удобным. Они позволяют разработчикам опускать указание типов в большинстве случаев, сохраняя возможность явно задавать необходимые типы, когда это требуется.