Почему концепции (общее программирование) были задуманы, когда у нас уже были классы и интерфейсы? - PullRequest
10 голосов
/ 02 сентября 2011

Также на сайте programmers.stackexchange.com :

Я понимаю, что концепции STL должны были существовать, и было бы глупо называть их "классами" или "интерфейсами", когда на самом деле они являются только документированными (человеческими) концепциями и не могут быть переведены в код C ++ при время, но когда им дали возможность расширить язык, чтобы приспособить концепции, почему они просто не изменили возможности классов и / или представили интерфейсы?

Разве концепция не очень похожа на интерфейс (100% абстрактный класс без данных)? Глядя на это, мне кажется, что интерфейсам не хватает поддержки только аксиом, но, возможно, аксиомы могли бы быть введены в интерфейсы C ++ (учитывая гипотетическое принятие интерфейсов в C ++ для принятия концепций), не так ли? Я думаю, что даже автоматические концепции могут быть легко добавлены к такому интерфейсу C ++ (автоматический интерфейс LessThanComparable, кто-нибудь?).

Разве concept_map не очень похож на шаблон адаптера? Если все методы встроены, адаптер по существу не существует вне времени компиляции; компилятор просто заменяет вызовы интерфейса встроенными версиями, вызывая целевой объект непосредственно во время выполнения.

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

Надеюсь, это достаточно ясно. Я могу переписать это, если вы думаете, что я не был; просто дай мне знать.

Ответы [ 4 ]

6 голосов
/ 02 сентября 2011

Существует большая разница между ООП и общим программированием, Предопределение .

В ООП, когда вы разрабатываете класс, у вас были интерфейсы, которые, как вы думаете, будут полезны. И это сделано.

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

Преимущество Концепций состоит в том, что вы не страдаете от Предопределения, вы можете выбрать класс из Библиотеки1, выбрать метод из Библиотеки2, и если он подходит, вы - золото (если это не так, вы можете использовать концептуальную карту). В OO вы должны каждый раз писать полноценный адаптер.

Вы правы, что оба кажутся похожими. Разница в основном заключается во времени привязки (и в том, что у Concept все еще статическая диспетчеризация вместо динамической диспетчеризации, как с интерфейсами). Концепции более открыты, поэтому их проще использовать.

2 голосов
/ 02 сентября 2011

Классы представляют собой форму с именем соответствия.Вы указываете, что класс Foo соответствует интерфейсу I, наследуя от I.

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

В результате именованное соответствие снижает возможность повторного использования классов в местах, которые не ожидались заранее, даже если они будутгодный к употреблению.

1 голос
/ 02 сентября 2011

Понятия на самом деле не являются частью C ++, они просто понятия!В C ++ нет способа «определить концепцию».Все, что у вас есть, template s и class es (STL - все классы шаблонов, как следует из названия: S tandard T emplate L ibrary).

Если вы имеете в виду C ++ 0x, а не C ++ (в этом случае я предлагаю вам изменить тег), пожалуйста, прочитайте здесь:

http://en.wikipedia.org/wiki/Concepts_(C++)

Некоторыечасти, которые я собираюсь скопировать и вставить для вас:

В ожидаемой версии C ++ 0x языка программирования C ++ концепции и связанные с ними понятия аксиом были предложенным расширением системы шаблонов C ++, предназначен для улучшения диагностики компилятора и , чтобы позволить программистам кодифицировать в программе некоторые формальные свойства шаблонов , которые они пишут.Включение этих ограниченных формальных спецификаций в программу (в дополнение к повышению ясности кода) может помочь в оптимизации некоторых компиляторов , а может потенциально помочь повысить надежность программы посредством использования инструментов формальной проверки для проверкичто реализация и спецификация действительно совпадают.

В июле 2009 года комитет C ++ 0x принял решение исключить концепции из проекта стандарта , поскольку они считаются "не готовыми" для C ++ 0x.

Основная мотивация введения концепций - для улучшения качества сообщений об ошибках компилятора .

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

0 голосов
/ 26 февраля 2017

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

...