A концепция представляет собой набор требований к типу. Например, у вас может быть концепция под названием «RandomAccessible», которая помещает требование в тип, который он реализует operator[](int)
в O (1) раз.
Поскольку концепции были отброшены из будущего стандарта C++, они существуют только как незаметно в C++ в качестве документации. Например, вы можете прочитать SGI's description of the Container concept.
Если тип соответствует всем требованиям концепции, вы называете это модель этой концепции. Например, std::vector
является моделью концепции контейнера (или, что эквивалентно, std::vector
«модели» контейнера).
И, наконец, политика - это единица поведения, которая может быть объединена с другими единицами поведения для создания сложных классов. Например, предположим, что вы хотите создать два класса: массив фиксированного размера и динамически изменяемый размер массива. Оба эти класса имеют много общих функций, но просто отличаются механизмами хранения и некоторыми функциями (например, вы не можете вызвать 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
.
(+1) хорошо написано: D –