Имеет ли смысл заменять интерфейсы / чисто абстрактные классы понятиями? - PullRequest
0 голосов
/ 17 декабря 2018

Как я понял, концепции очень похожи на интерфейсы. Подобно интерфейсам, концепции позволяют определять некоторый набор методов / концепций / интерфейсов, которые реализация ожидает и должна выполнить для своей задачи.И те, и другие усиливают внимание к семантическим потребностям.

Хотя Бьярне и многие другие люди, похоже, рассматривают концепции как способ избавиться от использования enable_if и в целом сложных шаблонов, мне интересно, имеет ли смысл использовать его вместо интерфейсов/ pure абстрактные классы.

Преимущества очевидны:

  • нет затрат времени выполнения (v-таблица)
  • вид утки, потому что подходящие классы не имеютдля реализации интерфейса
  • даже взаимосвязи между параметрами (которые интерфейсы вообще не поддерживают)

Конечно, недостаток не за горами:

  • нет определения шаблонов для проверки концепций, по крайней мере, на данный момент

Интересно, есть ли их больше, и в конце концов, не имеет ли это смысла.

Я знаю, что есть похожие вопросы, но они не являются специфическими для их цели, и на них нет ответа в ответе.Я также нашел других людей, которые придерживались той же идеи, но ни в коем случае не было кого-то, кто действительно поощрял / не одобрял это, не говоря уже об этом.

1 Ответ

0 голосов
/ 17 декабря 2018

Если вы используете абстрактные классы по их прямому назначению , то практически невозможно заменить их понятиями.Абстрактные базовые классы предназначены для полиморфизма runtime : возможность реализации интерфейса во время выполнения может быть отделена от сайтов, на которых этот интерфейс используется.Вы можете использовать пользовательский ввод или данные из файла, чтобы определить, какой экземпляр производного класса создать, а затем передать этот экземпляр другому коду, который использует указатель / ссылку на базовый класс.

Абстрактные классы предназначены для определенияинтерфейс для полиморфизма во время выполнения.

Шаблон создается во время компиляции.Таким образом, все в его интерфейсе должно быть проверено во время компиляции.Вы не можете варьировать, какую реализацию интерфейса вы используете для шаблона;он статически записывается в вашу программу, и шаблон создается с точным указанием только тех типов, которые вы указали в своем коде.Это полиморфизм во время компиляции.

Концепции предназначены для определения интерфейса для полиморфизма во время компиляции.Они не работают во время выполнения.

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

...