Middle+
48
questionbank

Как называется идиома статического полиморфизма в C++?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Curiously Recurring Template Pattern (CRTP), также известна как статичеcкий полиморфизм или полиморфизм времени компиляции.

Принцип CRTP основывается на том, что шаблонный класс Base использует в качестве шаблонного параметра сам себя, будучи при этом базовым классом для некоторого производного класса Derived.

c

Преимущества CRTP перед динамическим полиморфизмом (с виртуальными функциями):

  • Производительность: Вызовы функций являются статическими и разрешаются во время компиляции, избегая накладных расходов виртуальной таблицы.
  • Отсутствие накладных расходов на виртуальные функции: Нет необходимости хранить и использовать vptr/vtbl.
  • Более строгая типизация: Ошибки, связанные с несоответствием типов или отсутствием реализации, обнаруживаются на этапе компиляции.

Недостатки:

  • Необходимость знатть тип потомка: Base-класс должен быть шаблонным и "знать" тип производного класса.
  • Сложность для новичков: Паттерн может быть менее интуитивно понятен по сравнению с классическим наследованием с виртуальными функциями.
  • Невозможность работать с коллекцией разных CRTP-типов: Нельзя хранить в одном контейнере объекты разных производных CRTP-классов и вызывать их через базовое указание/ссылку.

Сравнение с динамическим полиморфизмом:

АспектCRTP (статический полиморфизм)Динамический полиморфизм (виртуальные функции)
Разрешение вызоваВремя компиляцииВремя выполнения
ПроизводительностьВыше (нет накладных расходов vtbl)Ниже (есть накладные расходы vtbl)
Накладные расходыНет vptr/vtblЕсть vptr/vtbl
Гибкость (коллекции)Нет (нельзя работать с разнородными типами через общий базовый указатель/ссылку)Да (можно работать с разнородными типами)
Обнаружение ошибокВремя компиляцииВремя выполнения
СложностьВыше для новичковНиже для новичков