Почему и как объектный файл старого кода может использовать новый код, который использует универсальную парадигму программирования, даже если шаблоны статически связаны?

Это совершенно другой вопрос, чем тот, который я задавал ранее, поэтому я публикую это.

Я хотел бы определить мою тему как субъективный вопрос, который вдохновляет ответы, которые объясняют «почему» и «как». Это разрешено согласно Центр помощи правила.

Чтобы сделать мой вопрос более конструктивным, я предоставляю вам ресурсы, которые лучше объясняют мою тему.

От C ++ SuperFAQ под вопросом

«Можете ли вы дать мне простую причину, по которой виртуальные функции (динамическое связывание, динамический полиморфизм) и шаблоны (статический полиморфизм) имеют большое значение?»

Автор говорит, «… программист может написать некоторый код, который вызывается фреймворком, написанным их пра-пра-дедушкой. Нет необходимости изменять код пра-пра-дедушки. Фактически, для динамического связывания с виртуальными функциями он не даже не нужно перекомпилировать. Даже если все, что у вас осталось, это объектный файл и исходный код, который написал пра-прадедушка, был утерян 25 лет назад, этот древний объектный файл будет вызывать новое расширение без каких-либо изменений. «

Он продолжает говорить, «Это расширяемость, а это ОО и универсальное программирование для мощной многократно используемой абстракции».

Кроме того, я недавно прочитал статью, написанную создателем C ++ Бьярном Страуструпом, под названием «Почему C ++ не просто объектно-ориентированный язык программирования«. В своей работе он определяет язык или технику как объектно-ориентированные, если и только если они непосредственно поддерживают:

  1. Абстракция — предоставление некоторой формы классов и объектов.

  2. Наследование — предоставление возможности создавать новые абстракции из существующих.

  3. Полиморфизм во время выполнения — предоставление некоторой формы связывания во время выполнения.

Он также кратко упоминает общее программирование.

6.7 Общее программирование — основная тема в C
Сообщество ++ в течение последних нескольких лет занималось разработкой методик, использующих шаблонный механизм.

Из чтения этих двух ресурсов я могу понять, как старый код может использовать новый код с помощью объектно-ориентированной парадигмы. Однако я не понимаю, как старый код может использовать новый код с помощью универсального программирования (в данном случае шаблонов), потому что универсальное программирование использует статическое связывание. Из моего предыдущего связанного вопроса Бен Фойгт прокомментировал это,

«Чтобы «старый» код шаблона был объединен с «новым» кодом шаблона, необходимо, чтобы оба были скомпилированы вместе.«

C ++ SuperFAQ Кажется, подразумевается (как для OO, так и для общего программирования), что старый код не должен быть перекомпилирован с новым кодом, чтобы использовать новый код, и что вам просто нужен объектный файл из старого кода. Тем самым поддерживается повторное использование кода.

Может ли кто-нибудь ответить на вопрос «почему» и «как», объектный файл старого кода может использовать новый код, который использует общую парадигму программирования, даже если шаблоны статически связаны?

редактировать

Я хотел бы объяснить ответ ниже более подробно, так как он поможет мне понять больше и может помочь другим понять. Так как универсальное программирование использует статическое связывание, исходный код старого кода и новый код должны быть скомпилированы «все вместе» для повторного использования кода вступить в силу. Это означает, что если у вас есть только объектный файл старого кода, вы не сможете использовать новый код с ним, так как для этого потребуется динамическое / позднее связывание, связывание во время выполнения.

4

Решение

Краткий ответ: не может. Я предполагаю, что это было то, что было сказано в первом предложении ответа, который вы связали:

Они могут улучшить повторное использование, позволяя старому коду вызывать новый код, предоставляемый во время выполнения (виртуальные функции) или время компиляции (шаблоны).

[Акцент добавлен]

Чтобы существующий код использовал шаблоны, вы делать придется перекомпилировать. Это означает, что вы должны начинать с (некоторой формы) исходного кода, а не с объектных файлов (по крайней мере, с того, что большинство людей воспринимают как обычные объектные файлы, в любом случае).

3

Другие решения

Я утверждаю, что старый код не только должен быть перекомпилирован для использования нового кода, но также должен быть изменен для использования нового кода, т.е. A * a = new A => A * a = new B, даже если A содержит функцию-член, объявленную с виртуальным ключевым словом, и B переопределил ее.

-1

По вопросам рекламы [email protected]