Ответ
Да, в контексте C++ шаблоны (templates), которые являются аналогом generics, реализуют форму полиморфизма, называемую параметрическим полиморфизмом (или полиморфизмом во время компиляции).
Ключевые отличия от runtime-полиморфизма (через виртуальные функции):
| Аспект | Параметрический (шаблоны) | Подтипный (виртуальные функции) |
|---|---|---|
| Время разрешения | Время компиляции. | Время выполнения. |
| Механизм | Инстанцирование шаблона для конкретного типа. | Динамическая диспетчеризация через vtable. |
| Связывание | Статическое, приводит к потенциально дублируемому коду. | Динамическое, один общий код для иерархии. |
| Требования к типам | Неявные (duck typing) — тип должен поддерживать все используемые операции. | Явные — тип должен наследоваться от базового класса. |
Пример шаблонного (параметрического) полиморфизма:
template <typename T>
T square(const T& value) { // Одна обобщенная реализация
return value * value; // Работает для любого типа с оператором *
}
int main() {
std::cout << square(5); // Инстанцируется square<int>
std::cout << square(2.5); // Инстанцируется square<double>
// Компилятор генерирует две разные специализации функции.
}
Таким образом, шаблоны позволяют писать обобщенные алгоритмы и структуры данных, которые адаптируются к разным типам на этапе компиляции, что является мощной формой полиморфизма.