Есть ли способ реализовать статический полиморфизм в Delphi 2010?
Статический полиморфизм в Delphi
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
Но ограничения класса или интерфейса в дженериках означают, что будет использоваться vmt (накладные расходы во время выполнения), и это по-прежнему динамический полиморфизм. Не так ли?
- person valentyn; 09.09.2009
Накладные расходы во время выполнения должны быть минимальными (я думаю, 1 поиск в массиве), так почему же это все-таки имеет значение?
- person jpfollenius; 09.09.2009
Поиск массива и вызов процедуры, я думаю. Те же накладные расходы на вызов виртуальной функции. Таким образом, это тот же вопрос, что и зачем использовать статический полиморфизм, если есть динамический полиморфизм. Я думаю, что это имеет значение, когда это повторяется огромное количество раз. В любом случае, почему я должен платить за это во время выполнения, когда у меня есть знания времени компиляции о том, какую функцию вызывать (или не вызывать).
- person valentyn; 09.09.2009
Валентин, вас никто не заставляет использовать дженерики. Вы можете написать обычную неуниверсальную функцию, которая напрямую вызывает ваши невиртуальные методы. Вы можете использовать перегрузку, чтобы дать нескольким таким функциям одно и то же имя.
- person Rob Kennedy; 09.09.2009