Понятие определяет набор ограничений на типы, которые хранятся влюбой
.
Существует три вида понятий.
- Библиотека определяет рядпредопределенных понятий.. Большинство из них эквивалентны пользовательским концепциям, но некоторые требуют специальной обработки.
- Пользователи могут определить свои собственные примитивные концепции, как описано ниже. Макросы
BOOST_TYPE_ERASURE_MEMBER
иBoost_TYPE_ERASURE_FREE
определяют понятия этой формы.
- Любая передовая последовательность MPL, элементы которой являются концепциями, также является концепцией. Это позволяет легко составлять концепции.
Каждое примитивное понятие определяет одну функцию. Первичная концепция должна быть специализацией шаблона класса, с статичной функцией члена, называемой, применяемой
, которая будет выполняться, когда функция отправляется вызовом
. Шаблон может принимать только параметры типа шаблона. Нетиповые параметры шаблона и параметры шаблона шаблона не допускаются.
Параметры шаблона концепции могут включать в себя заполнители. Рассмотрены следующие вопросы.
- Каждый аргумент шаблона может быть cv и/или эталонным квалифицированным типом заполнителя.
- Если аргумент шаблона является типом функции, его аргументы и тип возврата могут быть квалифицированными заполнителями.
Любые другие держатели игнорируются.
Понятие инстанциируется путем построениялюбого
из исходного значения или путем построениясвязывания
. Когда концепция инстанцируется определенным набором связываний типа, каждый заполнитель связывается с неквалифицированным типом ссылки cv. После замены каждого заполнителя в списке аргументов шаблона на тип, к которому он привязан, необходимо придерживаться следующего.
- Число аргументов, применяемых в связанном понятии, должно быть таким же, как число аргументов в несвязанном понятии.
- Аргументы и тип возврата, применимые в связанном понятии, могут быть получены из соответствующих аргументов и тип возврата в несвязанном понятии следующим образом: Если аргументом в несвязанной концепции является заполнитель с факультативными квалификаторами cv и эталонными квалификаторами, то аргумент в связанной концепции может быть найден путем замены заполнителя. В противном случае аргумент в несвязанной концепции должен быть таким же, как аргумент в связанной концепции.
template<class T = _self>
struct foo1 {
static void apply(const T& t) { t.foo(); }
};
template<>
struct foo1<int> {
static void apply(int i);
};
struct foo2 {
static void apply(const _self&);
};
template<class T = _self>
struct foo3 {
void apply(const T&);
};
template<class T = _self>
struct foo3 {
static void apply(T&);
static void apply(const T&);
};
template<class T>
struct foo4;
template<class T>
struct foo4<boost::mpl::vector<T> > {
static void apply(const T&);
};
template<template<class> class T>
struct foo5
{
static void apply(T<int>&);
};