Концепция (общее программирование)
В обобщенном программировании концепция — это описание поддерживаемых операций над типом , включая синтаксис и семантику. Таким образом, понятия связаны с абстрактными типами , но понятия не требуют отношения подтипа.
Использование языка
[ редактировать ]Этот термин использовался еще в 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
является.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Остерн, М.Х. Общее программирование и STL: использование и расширение стандартной библиотеки шаблонов C++ . 1998. стр. 17–18.
- ^ немного предыстории концепций и C++17 — Бьярн Страуструп , Бьярн Страуструп | 26 февраля 2016 г.
- ^ Alex Stepanov , by Bjarne Stroustrup | Jan 21, 2016
- ^ Черновой вариант спецификации C# 6.0 , Оператор foreach
- ^ Черновой вариант спецификации C# 6.0 , оператор using.
- ^ «Экспериментальные возможности Нима» . nim-lang.org . Проверено 19 июня 2023 г.
- ^ Stepanov, Alexander (2009). Elements of Programming . Addison-Wesley Professional. p. 49. ISBN 9780321635372 .
- ^ Общее количество заказов - Эффективное программирование с использованием компонентов
- ^ Тривиальный итератор