Имеет ли смысл заменять интерфейсы / чисто абстрактные классы понятиями?
Как я понял, концепции очень похожи на интерфейсы. Подобно интерфейсам, концепции позволяют определять некоторый набор методов / концепций / интерфейсов, которые реализация ожидает и должна выполнить для своей задачи. Оба усиливают акцент на семантических потребностях.
Хотя Бьярне и многие другие люди, похоже, рассматривают концепции как способ избавления от использования enable_if и в целом сложных шаблонов, мне интересно, имеет ли смысл использовать его вместо интерфейсов / чисто абстрактных классов.
Преимущества очевидны:
- нет времени выполнения (v-таблица)
- вид утки, потому что подходящие классы не должны реализовывать интерфейс
- четные отношения между параметрами (какие интерфейсы вообще не поддерживаются)
Недостаток конечно не далеко
- нет проверки определения шаблона для концептов, по крайней мере, на данный момент
- ...
Интересно, есть ли еще такие, и не имеет ли это смысла в конце концов.
Я знаю, что есть похожие вопросы, но они не являются специфическими для их цели, и на это не ответили. Я также нашел других людей, которые придерживались той же идеи, но ни в коем случае не было кого-то, кто действительно поощрял / обескураживал это, не говоря уже об этом.
1 ответ
Если вы используете абстрактные классы по их прямому назначению, то заменить их концепциями практически невозможно. Абстрактные базовые классы предназначены для полиморфизма во время выполнения: возможность во время выполнения отделять реализацию интерфейса от сайтов, на которых этот интерфейс используется. Вы можете использовать пользовательский ввод или данные из файла, чтобы определить, какой экземпляр производного класса создать, а затем передать этот экземпляр в другой код, который использует указатель / ссылку на базовый класс.
Абстрактные классы предназначены для определения интерфейса для полиморфизма во время выполнения.
Шаблон создается во время компиляции. Таким образом, все в его интерфейсе должно быть проверено во время компиляции. Вы не можете варьировать, какую реализацию интерфейса вы используете для шаблона; он статически записывается в вашу программу, и шаблон создается с точным указанием только тех типов, которые вы указали в своем коде. Это полиморфизм во время компиляции.
Концепции предназначены для определения интерфейса для полиморфизма во время компиляции. Они не работают во время выполнения.
Если вы использовали абстрактные базовые классы для полиморфизма во время компиляции, значит, вы поступили неправильно, и вам следовало бы остановиться задолго до появления концепций.