WikiSort.ru - Программирование

о проекте

Концепция — интерфейсное расширение шаблонов языка C++, опубликованное в технической спецификации ИСО/МЭК ISO TS 19217:2015[1]. По своей сути концепция является набором логических предикатов, размещённых за списком параметров шаблона, которые оцениваются во время компиляции исходного кода с целью установления ограничений на свойства аргументов, которые принимаются в качестве параметров шаблона[2].

Введение концепций связывают с дальнейшим развитием в языке С++ инструментария, основанного на парадигме обобщённого программирования[2]. Концепция может быть объявлена с шаблоном любого вида (класс-шаблон, шаблон-функция, или функция-член класса-шаблона), eё назначением является выявление логических несоответствий между свойствами типов данных, которые используются внутри тела шаблона и свойствами типов данных, которые поступают в шаблон в качестве входных параметров[2][3].

До введения в стандарт языка понятие концепции было реализовано в библиотеке общего назначения Boost в виде библиотечных классов проверки концепций BCCL (англ. Boost Concept Checking Library)[4].

Синтаксис текущего предложения (из Си++20)

Определение концепции.

template <class T>
concept bool EqualityComparable() { 
    return requires(T a, T b) {
        {a == b} -> Boolean;  // Концепция, означающая тип, преобразуемый в boolean
        {a != b} -> Boolean;
    };
}

Шаблон, использующий концепцию (обратите внимание, нет ключевого слова template).

void f(const EqualityComparable&);

Концепции будут участвовать в выборе, какую функцию из набора перегруженных применять, наряду с SFINAE. Компилятор предпочтёт самую «жёсткую» концепцию.

Если использовать концепцию в инициализаторе, это будет аналог auto, однако код будет компилироваться, если концепция поддерживается.

Sortable x = f(y); // аналог auto x = f(y), компилируется, если результат — тип, подходящий под Sortable

Предпосылки

В обобщённом программировании концепция — это такой набор требований к типу, чтобы шаблон обобщённого программирования имел смысл. Например, шаблон It2 std::copy(It1, It1, It2) предполагает такие соотношения между типами-итераторами It1 и It2.

  • It1 и It2 — однонаправленные итераторы.
  • Между типами *It2 и *It1 возможно присваивание.

Эти концепции описаны в документации по Си++, и они — словесное описание условий, когда код компилируется. Так, при попытке специализировать шаблон с параметрами It1=int*, It2=int** компилятор сообщит, что невозможно присваивание между int* и int. При этом есть недостатки.

  • Ошибка выпадет в глубине заголовочного файла STL — в коде, который сложен для понимания и априори считается правильным.
  • Зачастую тексты ошибок крайне многословны, и сложно выяснить, чего именно не хватает, чтобы шаблон специализировался.
  • Когда программист пишет шаблон, он может случайно выйти из концепции и не заметить это. Это никак нельзя проверить, кроме как попытавшись специализировать шаблон. На сложных шаблонах «проверка специализацией» не так проста, как кажется — большинство простейших типов поддерживают много лишних функций. Так, недостаточно проверить std::vector<T> на типе int: помимо операций «конструктор без параметров», «конструктор перемещения» и «присвоить с перемещением», минимально требуемых для вектора, у целого типа есть конструктор копирования, операция присваивания, математические операции и многое другое, и нет гарантий, что они не используются.

По сей день синтаксически описать концепции получилось только ограниченно — так, в Java роль концепций играют утверждения наподобие class Test <T extends Testable>.

Текущее состояние

В каком-то виде концепции реализованы в G++ 6 и выше.

Примечания

  1. ISO/IEC TS 19217:2015. ISO (15 November 2015).
  2. 1 2 3 Остерн М. Г. Концепции и моделирование // Обобщённое программирование и STL: использование и наращивание стандартной библиотеки шаблонов С++ = M. H. Austern. Generic Programming and the STL. — Санкт-Петербург: Невский Диалект, 2004. — С. 32. — 544 с. ISBN 5-7940-0119-4.
  3. Siek J., Lee L.-Q., Lumsdaine A. 2.3 Concepts and Models // The Boost Graph Library. User Guide and Reference Manual. — Addison-Wesley. — P. 27. ISBN 0-201-72914-8.
  4. Siek J., Lee L.-Q., Lumsdaine A. 2.5 Concept Checking // The Boost Graph Library. User Guide and Reference Manual. — Addison-Wesley. — P. 36. ISBN 0-201-72914-8.

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2019
WikiSort.ru - проект по пересортировке и дополнению контента Википедии