Концепция (C++)Концепция — интерфейсное расширение шаблонов языка C++, опубликованное в технической спецификации ИСО/МЭК ISO TS 19217:2015[1]. По своей сути концепция является набором логических предикатов, размещённых за списком параметров шаблона, которые оцениваются во время компиляции исходного кода с целью установления ограничений на свойства аргументов, которые принимаются в качестве параметров шаблона[2]. Введение концепций связывают с дальнейшим развитием в языке C++ инструментария, основанного на парадигме обобщённого программирования[2]. Концепция может быть объявлена с шаблоном любого вида (класс-шаблон, шаблон-функция, или функция-член класса-шаблона), её назначением является выявление логических несоответствий между свойствами типов данных, которые используются внутри тела шаблона и свойствами типов данных, которые поступают в шаблон в качестве входных параметров[2][3]. До введения в стандарт языка понятие концепции было реализовано в библиотеке общего назначения Boost в виде библиотечных классов проверки концепций BCCL (англ. Boost Concept Checking Library)[4]. Синтаксис текущего предложения (из Си++20)Определение концепции. template <class T>
concept EqualityComparable() {
requires(T a, T b) {
{a == b} -> Boolean; // Концепция, означающая тип, преобразуемый в boolean
{a != b} -> Boolean;
};
}
Шаблон, использующий концепцию (обратите внимание, нет ключевого слова template). void f(const EqualityComparable auto&);
Концепции будут участвовать в выборе, какую функцию из набора перегруженных применять, наряду с SFINAE. Компилятор предпочтёт самую «жёсткую» концепцию. Если использовать концепцию в инициализаторе, это будет аналог Sortable auto x = f(y); // аналог auto x = f(y), компилируется, если результат — тип, подходящий под Sortable
ПредпосылкиВ обобщённом программировании концепция — это такой набор требований к типу, чтобы шаблон обобщённого программирования имел смысл. Например, шаблон
Эти концепции описаны в документации по Си++, и они — словесное описание условий, когда код компилируется. Так, при попытке специализировать шаблон с параметрами
Кроме того, приходится делать функции, которые появляются или исчезают в зависимости от некоторых условий (соответствия или несоответствия концепции). В Си++17 шаблоны для этого сложны. По сей день синтаксически описать концепции получилось только ограниченно — так, в Java роль концепций играют утверждения наподобие Текущее состояние
Примечания
|