A concept - это набор требований к типу. Например, вы могли бы иметь концепцию под названием «RandomAccessible», которая накладывает требование на тип, который он реализует operator[](int)
за O (1) раз.
Поскольку понятия были исключены из грядущего стандарта C ++, они существуют только в C ++ как документация. Например, вы можете прочитать описание SGI концепции контейнера .
Когда тип удовлетворяет всем требованиям концепции, вы называете его моделью этой концепции. Например, std::vector
- это модель концепции Контейнера (или, что эквивалентно, std::vector
«модели» Контейнера).
Наконец, policy - это единица поведения, которую можно комбинировать с другими единицами поведения для создания сложных классов. Например, предположим, что вы хотите создать два класса: массив фиксированного размера и динамически изменяемый размер массива. Оба этих класса имеют много общих функций, но отличаются только механизмами их хранения и некоторыми функциями (например, вы не можете вызвать push_back
для массива фиксированного размера).
template <class T, class StoragePolicy>
class array : public StoragePolicy
{
public:
T& operator[](int i) { return data[i]; }
};
template <class T, int N>
class fixed_storage
{
T data[N];
};
template <class T>
class dynamic_storage
{
T* data;
public:
void push_back(const T& value)
{
// Code for dynamic array insertion
}
};
Использование будет следующим:
int main()
{
array<int, fixed_storage<int, 10> > fixed_array;
array<int, dynamic_storage<int> > dynamic_array;
dynamic_array.push_back(1);
fixed_array[9] = dynamic_array[0];
}
Очевидно, что это очень грубый и неполный пример, но я надеюсь, что он освещает концепцию, лежащую в основе политики.
Обратите внимание, что в этом примере мы можем сказать, что fixed_storage
и dynamic_storage
являются "моделями" концепции StoragePolicy
. Конечно, нам нужно было бы формально определить, что именно требует концепт StoragePolicy
от своих моделей. В этом случае было бы просто определить индексируемую data
переменную-член.