Jump to content

Концепция (общее программирование)

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

Использование языка

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

Этот термин использовался еще в 1998 году для STL . [1] поскольку это была одна из первых библиотек, широко использовавших шаблоны. Термин «концепция» (и его популяризация) приписывается Александру Степанову . [2] [3] главный разработчик STL.

В стандарте C++ 1998 года термин «Концепция» был введен для обозначения простого описания требований к определенному типу, обычно являющемуся параметром шаблона. Он не был закодирован в языке явно — концепция выражалась только в том, какие операции выполняются над объектами этого типа и что, как ожидается, будет работать (то есть правильно компилироваться). Было предложение добавить концепции в качестве явной функции языка в C++11 , но оно было отклонено как «не готовое». C++20 в конечном итоге принял усовершенствованную концепцию.

Поскольку дженерики в Java и C# C++ имеют некоторое сходство с шаблонами , роль концепций там играют интерфейсы . Однако между концепциями и интерфейсами есть одно важное различие: когда для реализации определенного интерфейса требуется параметр шаблона, соответствующим типом может быть только класс, который реализует (явно) этот интерфейс. Концепции приносят больше гибкости, поскольку их можно реализовать двумя способами:

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

Но в языке C# есть несколько конструкций, где используемый тип не обязательно должен явно реализовывать определенный интерфейс, требуется лишь соответствие соответствующему шаблону (однако эти шаблоны не называются концептами ). Например, foreach Оператор итерации позволяет итерируемому объекту быть любого типа, если он реализует соответствующий GetEnumerator метод. [4] (Сравните с using заявление, которое требует ресурса для реализации System.IDisposable интерфейс. [5] )

Язык программирования Nim реализует концепции в виде серии произвольных логических предикатов времени компиляции. [6]

Другим языком, реализующим нечто очень похожее на концепции, является Haskell , где эта функция называется классами типов .


Всего заказа

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

Концепция тотального порядка описывает семантику < оператор. Тип полностью упорядочен, когда < является бинарным предикатом и удовлетворяет следующим свойствам: [7] [8]

  • антирефлексивный: !(a < a) за любую стоимость a.
  • переходный: Если a < b и b < c затем a < c.
  • антисимметричный: если a < b затем !(b < a).
  • итого: Если a != b затем a < b или b < a.

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

#include <concepts>
template <typename T>
    requires std::totally_ordered<T>
T min(T a, T b) {
    // < is defined.
    if (b < a) {
       return b;
    } else {
       // !(b < a) implies a == b or a < b
       return a;
    }
}

Итератор

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

Если тип I удовлетворяет концепции тривиального итератора в C++ и i имеет тип I, следующие допустимые выражения с соответствующей семантикой: [9]

  • I i конструкция по умолчанию.
  • *i должен быть конвертируем в какой-либо тип T.
  • i->m действителен, если (*i).m является.

См. также

[ редактировать ]
  1. ^ Остерн, М.Х. Общее программирование и STL: использование и расширение стандартной библиотеки шаблонов C++ . 1998. стр. 17–18.
  2. ^ немного предыстории концепций и C++17 — Бьярн Страуструп , Бьярн Страуструп | 26 февраля 2016 г.
  3. ^ Alex Stepanov , by Bjarne Stroustrup | Jan 21, 2016
  4. ^ Черновой вариант спецификации C# 6.0 , Оператор foreach
  5. ^ Черновой вариант спецификации C# 6.0 , оператор using.
  6. ^ «Экспериментальные возможности Нима» . nim-lang.org . Проверено 19 июня 2023 г.
  7. ^ Stepanov, Alexander (2009). Elements of Programming . Addison-Wesley Professional. p. 49. ISBN  9780321635372 .
  8. ^ Общее количество заказов - Эффективное программирование с использованием компонентов
  9. ^ Тривиальный итератор
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 073b79c09ef02f0d8ec3992c8d251c6e__1716239760
URL1:https://arc.ask3.ru/arc/aa/07/6e/073b79c09ef02f0d8ec3992c8d251c6e.html
Заголовок, (Title) документа по адресу, URL1:
Concept (generic programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)