Для каждой концепции существует шаблон класса проверки концепции, который можно использовать для обеспечения того, чтобы данный тип (или набор типов) моделировал концепцию. Библиотека проверки концепции Boost Concept Checking Library (BCCL) включает шаблоны классов проверки концепции для всех концепций, используемых в стандартной библиотеке C++. См. разделСсылкадля полного списка. Кроме того, в других библиотеках бустера есть классы проверки концепций, характерных для этих библиотек. Например, существуют понятияграфаикарты свойств.. Кроме того, всякий раз, когдакому-либотребуется выразить требования, которые еще не сформулированы существующей концепцией, должен быть создан новый класс проверки концепции. Как это сделать объясняется вСоздание класса проверки концепции.
Примером класса проверки концепции от BCCL является классEqualityComparableConcept. Класс соответствует требованиям EqualityComparable, описанным в 20.1.1 стандарта C++, и концепцииEqualityComparable, задокументированной в SGI STL.
template <class T>
struct EqualityComparable;
Аргумент шаблона - это тип, который нужно проверить. Это и есть цель.X>- убедиться, чтоXмоделирует концепцию равенства.
BOOST_CONCEPT_ASSERT()
Наиболее универсальным способом проверки требований к концепции является использование макроса<BOOST_CONCEPT_ASSERT()>. Вы можете использовать этот макрос в любом объеме, пройдя концептуальную проверку шаблонной специализации, заключенной в скобках.Примечание:, что означает призывы<BOOST_CONCEPT_ASSERT>будет выглядеть использоватьдвойные скобки.
// In my library:
template <class T>
void generic_library_function(T x)
{
BOOST_CONCEPT_ASSERT((EqualityComparable<T>));
// ...
};
template <class It>
class generic_library_class
{
BOOST_CONCEPT_ASSERT((RandomAccessIterator<It>));
// ...
};
// In the user's code:
class foo {
//...
};
int main() {
foo x;
generic_library_function(x);
generic_library_class<std::vector<char>::iterator> y;
//...
}
BOOST_CONCEPT_REQUIRES
Одна из приятных особенностей предлагаемого синтаксиса C++0xдля объявления шаблонов с ограниченными функциямизаключается в том, что ограничения являются частью декларации функции, поэтому клиенты будут видеть их.<BOOST_CONCEPT_ASSERT>может выражать ограничения только в определении шаблона функции, которое скрывает ограничение в теле функции. Помимо потери самодокументирующего интерфейса, утверждение соответствия только в функциональном корпусе может нежелательно задержать проверку, если функция явно инстанцирована в другом блоке перевода, чем тот, в котором она называется, или если компилятор делает инстанциацию времени ссылки.
МакроBOOST_CONCEPT_REQUIRESможет использоваться в объявлении шаблона функции для проверки того, моделирует ли какой-либо тип концепцию. Он принимает два аргумента:список ограниченийи тип возврата шаблона функции. Список ограничений принимает форму последовательности смежных шаблонных специализаций проверки концепциив двойных скобках, а тип возврата функции также должен быть скоблен. Например, стандартный алгоритм<stable_sort>может быть объявлен следующим образом:
Обратите внимание, что алгоритм требует, чтобы тип значения итератора был менее сопоставимым, и он получает доступ к этому типу значений через шаблон проверки концепции<Mutable_RandomAccessIterator>. В целом, классы проверки концепции Boost выставляют ассоциированные типы в виде вложенных типовых элементов, чтобы вы могли использовать этот синтаксис, который имитирует подход, используемый в поддержке концепции, предлагаемой для следующей версии C++.
Multi-Type Concepts
Некоторые концепции имеют дело с более чем одним типом. В этом случае соответствующий класс проверки концепции будет иметь несколько параметров шаблона. Следующий пример показывает, какBOOST_CONCEPT_REQUIRESиспользуется с концепциейReadWritePropertyMap, которая принимает два параметра типа: карта свойств и ключевой тип для карты.
template <class G, class Buffer, class BFSVisitor,
class ColorMap>
BOOST_CONCEPT_REQUIRES(
((ReadWritePropertyMap<ColorMap, typename IncidenceGraph<G>::vertex_descriptor>)),
(void)) // return type
breadth_first_search(G& g,
typename graph_traits<IncidenceGraph>::vertex_descriptor s,
Buffer& Q, BFSVisitor vis, ColorMap color)
{
typedef typename IncidenceGraph<G>::vertex_descriptor Vertex;
...
}
Хотя концептуальные проверки предназначены для использования универсальными библиотеками, они также могут быть полезны конечным пользователям. Иногда можно не быть уверенным, что какой-то тип моделирует конкретную концепцию. Синтаксические требования, по крайней мере, можно легко проверить, создав небольшую программу и используяBOOST_CONCEPT_ASSERTс рассматриваемым типом и концепцией. Например:
// Make sure list<int> has bidirectional iterators.
BOOST_CONCEPT_ASSERT((BidirectionalIterator<std::list<int>::iterator>));
Статья Using Concept Checks раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.