Мы обсуждали, как важно выбрать минимальные требования (понятия) для входов в компонент, но не менее важно проверить, что выбранные понятияохватываюталгоритм. То есть любая возможная ошибка пользователя должна быть поймана концептуальными проверками и не пропущена. Концептуальное покрытие может быть проверено с помощью классовархетипов.. Класс архетипа — это точная реализация интерфейса, связанного с конкретной концепцией. Время выполнения класса архетипа не важно, функции могут быть оставлены пустыми. Простая тестовая программа может быть скомпилирована с классами архетипов в качестве входов в компонент. Если программа компилируется, то можно быть уверенным, что концепции охватывают компонент. Следующий код показывает класс архетипа для концепцииInput Iterator. Необходимо позаботиться о том, чтобы архетип точно соответствовал концепции. Например, концепция гласит, что тип возврата оператора*()должно быть преобразовано в тип значения. В нем не содержится более строгого требования о том, чтобы тип возврата былT&илиconst T&. Это означает, что было бы ошибкой использоватьT&илиconst T&для возвратного типа класса архетипа. Правильный подход заключается в создании искусственного возвратного типа, который можно конвертировать вT, как мы сделали здесь со ссылкой. Действительность теста класса архетипа полностью зависит от его точного соответствия концепции, которое должно быть проверено тщательным (ручным) осмотром.
Общие алгоритмы часто тестируются путем инстанцирования с рядом общих типов ввода. Например, можно применитьstd::stable_sort().с основными типами указателей в качестве итераторов. Несмотря на то, что это подходит для тестирования поведения алгоритма во время выполнения, это не помогает обеспечить охват концепции, поскольку типы C++ никогда не соответствуют конкретным концепциям. Вместо этого они часто предоставляют больше, чем минимальная функциональность, требуемая какой-либо одной концепцией. Несмотря на то, что шаблон функции имеет проверки концепции и компилируется с заданным типом, проверки все еще могут не охватывать всю функциональность, которая фактически используется. Вот почему важно компилировать классы архетипов в дополнение к тестированию с общими типами ввода.
Ниже приводится выдержка изstl_concept_covering.cpp, которая показывает, как архетипы могут использоваться для проверки требуемой документации дляstd::stable_sort(). В этом случае, похоже, что требованияCopyConstructibleиAssignableбыли забыты в документации SGI STL (попробуйте удалить эти архетипы). Классы архетипов Boost были разработаны таким образом, чтобы их можно было наслоить. В этом примере тип значения итератора состоит из трех архетипов. В ссылкекласса архетипапараметры шаблона, названныеБаза, указывают, где можно использовать многоуровневую парадигму архетипа.
Статья Concept Covering and Archetypes раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.