Подтвердить что ты не робот

Определение и реализация статического полиморфизма

У меня есть некоторые вопросы о концепции статического полиморфизма, о котором я когда-либо слышал; вы можете интерпретировать их прежде всего в контексте С++, но я был бы признателен за языковые агностические ответы, где это применимо (следовательно, помечая как С++, так и язык-агностик).

  • Как определить статический полиморфизм вообще? В качестве примера я считаю, что функция std::sort из С++ считается статически полиморфной, поскольку она зависит от некоторого интерфейса, предоставляемого некоторыми объекты, которые ведут себя как итераторы, а точное поведение в интерфейсе предоставленных итераторов может быть определено во время компиляции. Является ли это объяснением, как мы определяем статический полиморфизм, или это просто описание конкретного случая и там больше?

  • Каковы общие шаблоны кода использования статического полиморфизма в С++? Также: SP достигается только через шаблоны в С++?

  • Верно ли, что данная диаграмма класса UML напрямую не описывает, как обрабатывается полиморфизм, и, таким образом, он может быть хотя бы частично реализован либо статически, либо динамически? Другими словами: выбор статического или динамического полиморфизма не зависит от модели ООП и, следовательно, до того, как разработчик примет решение?

  • Является ли статический полиморфизм только С++-специфичным и связан с тем, как работают шаблоны? Если нет, то присутствует ли он в каких-либо других основных языках помимо С++? Можем ли мы иметь эквивалент статического полиморфизма в Java, С#.. что угодно, и принесет ли он какие-либо выгоды?

  • Самое важное... Каковы фактические преимущества использования статического полиморфизма? Я думаю, мы можем согласиться с тем, что он снижает гибкость кода; каковы преимущества, кроме того - в случае С++ - сохранение одного разыменования указателя (стоимость виртуальной функции/указателя на функцию/делегата)? Что такое класс проблем, где статический полиморфизм особенно полезен, правильный выбор для реализации?

4b9b3361

Ответ 1

  • Статическое полиморфное поведение type polymorphism, которое происходит во время компиляции, а не времени выполнения.
  • Да.
  • UML - это то, как классы взаимодействуют во время выполнения - я не верю, что есть формат UML для описания шаблонов, но я мог ошибаться.
  • Насколько я знаю, это С++ специфический, но я не уверен, учитывая, что я не использовал каждый язык, когда-либо изобретенный.:) Это говорит о том, что языки JIT'd, такие как С# и Java, часто очень хороши в удалении влияния производительности косвенных вызовов в некоторых случаях, используя информацию, полученную во время выполнения, а не во время компиляции. Независимо от того, является ли это во время компиляции или нет, это похоже на воздух, хотя... в конце концов, это называется компилятором Just-In-Time.
  • Главное преимущество - просто производительность. Политизм времени выполнения может делать все, что может сделать статический полиморфизм (на самом деле он может сделать больше), но он несет стоимость косвенных вызовов (которые могут быть дорогими, если их достаточно)

Теперь сами шаблоны имеют много преимуществ, кроме достижения полиморфизма времени компиляции - например, магия SFINAE, которая делает работу boost::bind, конечно, не полиморфной - она ​​просто существует, чтобы сгладить несоответствия в самом языке.

Ответ 2

Как определить статический полиморфизм в целом?

Лучший способ понять это с помощью примеров. Политический дизайн является одним из примеров статического полиморфизма. И, на мой взгляд, это очень мощная техника для достижения статического полиморфизма.

Другим примером является Любопытно повторяющийся шаблон шаблона (CRTP), который также является мощным методом.