Concepts (C ++)

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

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

Первоначально относящаяся к предложениям для C ++ 11, исходная спецификация концепций была пересмотрена несколько раз, прежде чем теперь формально является обязательной частью C ++ 20.

Содержание
  • 1 Основные области применения
  • 2 Пример: EqualityComparable
  • 3 Диагностика компилятора
  • 4 Разрешение перегрузки
  • 5 Определение типа
  • 6 Состояние реализации
  • 7 История
  • 8 См. Также
  • 9 Примечания
  • 10 Ссылки
  • 11 Внешние ссылки
Основные области применения

Основные применения концепций:

  • Введение проверки типов в программирование шаблонов
  • Упрощенное диагностика компилятора для неудачных экземпляров шаблона
  • Выбор перегрузок шаблонов функций и специализаций шаблонов классов на основе свойств типа
  • Ограничение автоматического вывода типа
Пример: EqualityComparable

Ниже приводится декларация концепции EqualityComparable из стандартной библиотеки C ++ с поддержкой концепций (которая является отдельной технической спецификацией ISO, ISO / IEC DTS 21425). Этой концепции удовлетворяет любой тип T, такой, что для lvalues ​​ aи bтипа Tвыражения a == bи a! = bкомпилируются, и их результаты могут быть преобразованы в тип, который удовлетворяет концепции "Boolean":

template concept EqualityComparable = requires (T a, T b) {{a == b} ->std :: boolean; {a! = b} ->std :: boolean; };

Шаблон функции, ограниченный этой концепцией, может быть объявлен следующим образом:

void f (const EqualityComparable auto ); // объявление шаблона ограниченной функции

И может вызываться как обычно:

f (42); // ОК, int удовлетворяет EqualityComparable
Диагностика компилятора

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

Например, std :: sortтребует, чтобы его первые два аргумента были итераторами произвольного доступа. Если аргумент не является итератором или является итератором другой категории, ошибка возникнет, когда std :: sortпопытается использовать свои параметры как двунаправленные итераторы:

std :: list l = {2, 1, 3}; std :: sort (l.begin (), l.end ());

Типичная диагностика компилятора без концепций - это более 50 строк вывода, начиная с неудачной компиляции выражения, которое пытается вычесть два итератора:

При создании экземпляра 'void std :: __ sort (_RandomAccessIterator, _RandomAccessIterator, _Compare) [с _RandomAccessIterator = std :: _ List_iterator ; _Compare = __gnu_cxx :: __ ops :: _ Iter_less_iter]': ошибка: нет совпадения для' operator- '(типы операндов:' std :: _ List_iterator 'и' std: : _List_iterator ') std :: __ lg (__ last - __first) * 2,

Если используются концепции, ошибка может быть обнаружена и сообщена в контексте вызова:

error : невозможно вызвать функцию 'void std :: sort (_RAIter, _RAIter) [with _RAIter = std :: _ List_iterator ]' примечание: концепция 'RandomAccessIterator ()' не была удовлетворена
Разрешение перегрузки

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

Выведение типа

Концепции могут использоваться вместо заполнителя неограниченного вывода типа autoв объявлениях переменных и типах возвращаемых функций:

auto x1 = f (y) ; // тип x1 выводится из того, что возвращает f Sortable auto x2 = f (y); // тип x2 определяется, но компилируется только в том случае, если он удовлетворяет Sortable
Статус реализации

Концепции TS, как указано в ISO / IEC TS 19217: 2015, реализованы как экспериментальная функция в GCC 6. Концепции C ++ 20 полностью реализованы в GCC 10 и частично в MSVC 19.23 и Clang 10.

History

Другая форма концепций, широко известный как «C ++ 0x Concepts», был временно принят в рабочий документ для C ++ 11, но был удален в 2009 году. Помимо самих концепций, «C ++ 0x Concepts» включал карты концепций (функция, которая может сделать возможным, например, для концепции «Стек» принимать std :: vector, автоматически отображая операции «Стек», такие как 'push () `, в операции с разными именами на 'std :: vector', например 'push_back ()') и аксиомах (средство для указания семантических свойств, таких как ассоциативность или коммутативность, позволяющее компилятору использовать преимущества этих свойств без доказательства).

В отличие от этого отвергнутого предложения, версия Concepts для C ++ 20 иногда упоминается как «Concepts Lite».

На заседании комитета по стандартам C ++ в марте 2016 г. эволюция работала группа перешла на объединение концепций в основной стандарт C ++ 17, но это предложение было отклонено в полном составе.

Concepts v1 был объединен в C ++ 20 draft.

версия функции Range "One Range", которая зависит от концепций, также была объединена с C ++ 20.

См. также
Примечания
  1. ^«Серия выпусков GCC 6 - Изменения, новые функции и исправления».
  2. ^«Поддержка компилятора C ++ (gcc)».
  3. ^«Поддержка компилятора C ++».
  4. ^«Поддержка C ++ в Clang».
  5. ^Бьярн Страуструп (22 июля 2009 г.). «Решение C ++ 0x по удалению концепций». Доктор Доббс.
  6. ^Эндрю Саттон (24 февраля 2013 г.). «Concepts Lite: ограничение шаблонов с помощью предикатов». isocpp.org.
  7. ^Хонерманн, Том (6 марта 2016 г.). «Почему Concepts не создали C ++ 17». honermann.net.
  8. ^"Тема обсуждения комитета ISO C ++ в Торонто, 2017 г. (Основные понятия на C ++ 20; опубликованы сопрограммы, диапазоны и сетевые TS): cpp".
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-15 08:49:27
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте