Статический полиморфизм в Delphi

Есть ли способ реализовать статический полиморфизм в Delphi 2010?


person valentyn    schedule 09.09.2009    source источник
comment
Если вы имеете в виду что-то вроде шаблонов C++, как это вписывается в концепцию модуля? Разрешить код в разделе интерфейса?   -  person mghie    schedule 09.09.2009
comment
Не могу понять, как концепция модуля мешает только некоторым функциям шаблонов C++. На самом деле я хотел бы иметь все возможные функции шаблона C++ (я понимаю, что дженерики и шаблоны разные), но сейчас мне было бы достаточно, если бы компилятор Delphi проверял выражение с параметрами дженериков после создания дженерика. Например, я не хочу видеть ошибку компилятора, когда T - это универсальный параметр, и я пытаюсь вызвать T.do_some(), прежде чем использовать этот универсальный тип с конкретным типом.   -  person valentyn    schedule 09.09.2009
comment
Конечно, вам нужна ошибка компилятора в случае, если T не имеет ограничений. Как компилятору узнать о существовании метода do_some? Вот для чего нужны ограничения...   -  person jpfollenius    schedule 10.09.2009


Ответы (2)


Статический полиморфизм в Delphi невозможен; дженерики не являются шаблонами. В отличие от шаблонов, дженерики анализируются во время объявления, а не во время создания экземпляра. Вот почему скомпилированный модуль (*.dcu) должен содержать только AST-представление общего объекта, в то время как создание AST из неконкретного объявления шаблона C++ практически невозможно.

person Moritz Beutel    schedule 09.09.2009

Начиная с Delphi 2009, существуют дженерики. В сочетании с ограничениями класса или интерфейса вы можете использовать их для реализации статического полиморфизма.

К сожалению, поддержка дженериков в Delphi 2009 очень ошибочна, поэтому вы можете рассмотреть возможность использования Delphi 2010 (перечитывая ваш вопрос, похоже, вы все равно используете D2010)

person jpfollenius    schedule 09.09.2009
comment
Но ограничения класса или интерфейса в дженериках означают, что будет использоваться vmt (накладные расходы во время выполнения), и это по-прежнему динамический полиморфизм. Не так ли? - person valentyn; 09.09.2009
comment
Накладные расходы во время выполнения должны быть минимальными (я думаю, 1 поиск в массиве), так почему же это все-таки имеет значение? - person jpfollenius; 09.09.2009
comment
Поиск массива и вызов процедуры, я думаю. Те же накладные расходы на вызов виртуальной функции. Таким образом, это тот же вопрос, что и зачем использовать статический полиморфизм, если есть динамический полиморфизм. Я думаю, что это имеет значение, когда это повторяется огромное количество раз. В любом случае, почему я должен платить за это во время выполнения, когда у меня есть знания времени компиляции о том, какую функцию вызывать (или не вызывать). - person valentyn; 09.09.2009
comment
Валентин, вас никто не заставляет использовать дженерики. Вы можете написать обычную неуниверсальную функцию, которая напрямую вызывает ваши невиртуальные методы. Вы можете использовать перегрузку, чтобы дать нескольким таким функциям одно и то же имя. - person Rob Kennedy; 09.09.2009