Я хотел бы знать точные все же сжатые определения этих трех понятий в одном месте. Качество ответа должно зависеть от следующих двух точек.
Примечание:
Существует, вероятно, много корректных ответов, так как каждое понятие имеет много различных фасетов. Если будет много хороших ответов, то я в конечном счете превращу вопрос в CW и агрегирую ответы.
- Сообщение принимает редактирование-
Повышение имеет хорошую статью об универсальных концепциях программирования
Концепция - это набор требований к типу.Например, у вас может быть концепция под названием «RandomAccessible», которая накладывает требование на тип, который реализует operator [] (int)
за время O (1).
Поскольку концепции были исключены из будущего стандарта C ++, они существуют в C ++ неосязаемо только как документация. В качестве примера вы можете прочитать описание SGI концепции контейнера .
Когда тип соответствует всем требованиям концепции, вы называете это моделью этой концепции. Например, 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
от своих моделей.В этом случае было бы просто определить переменную члена индексируемых данных данных
.
A.o. документация SGI ссылается на "модель" как на то, что было введено в качестве "концептов" в предложении C++0x: это время компиляции, эквивалентное тому, что такое "интерфейс" в моделировании OO. В ней обобщены требования, предъявляемые к общему коду параметра шаблона.
В качестве примера можно сказать, что параметры OutputIterator
функции std::transform
должны реализовывать operator++()
и operator=( T )
для того, чтобы функция работала.
Политика - это другое дело: она делает алгоритм изменяемым извне. Хорошим примером является менее используемый параметр Allocator
контейнеров stl: он подсказывает алгоритму, как выделять память. При желании можно сделать std::vector
, где вся функция vector
выделит память в облаке, а не на куче. (Я не склонен реализовывать этот аллокатор, заметьте).
Filestream реализует IDisposable и требует вызова Dispose для освобождения внешних ресурсов, а также неявного; y вызова close (). Экземпляр Filestream должен быть свернут в блок использования, поскольку он обеспечивает вызов Dispose даже при возникновении исключения. Однако, чтобы ответить на ваш вопрос, так как вы не закрыли файловый поток, ваш процесс, предположительно процесс w3wp.exe, все еще имеет дескриптор в потоке файлов, и единственный способ, который вы можете выпустить, это сбросить iis или повторно использовать пул приложений. Для будущих ссылок просто оберните файловый поток в блок использования, чтобы он был безопасным.
-121--4648438-Просто удалите элемент управления с панели:
panel.Controls.Remove(someControlInstance);
Как только на него не будет ссылок, он будет подлежать сбору мусора и неуправляемые ресурсы будут правильно утилизированы.
-121--4903910-Концепция представляет собой набор требований, которые тип должен удовлетворять для моделирования концепции.
Например, тип T
имеет значение LessherCompatible
, если для пары объектов a
и b
типа T
выражение a < b
хорошо сформировано, преобразуется в bool
и вызывает строгий слабый порядок. Тип int
является примером модели LessherCompatible
.
Концепции могут формировать иерархии уточнения. Концепция A
является уточнением концепции B
, если требования A
являются надмножеством требований B
. Например, BidirecedIterator
является уточнением ForwardIterator
.
Концепции используются для ограничения набора типов, с которыми может быть специализирован шаблон. Например, алгоритм std:: sort
может принимать пару объектов при условии, что они моделируют RandomStartIterator
.
std::vector<int> vec;
std::list<int> list;
// OK, std::vector<int>::iterator is a model of `RandomAccessIterator`.
std::sort(vec.begin(), vec.end());
// error, std::list<int>::iterator is only a model of `BidirectionalIterator`.
std::sort(list.begin(), list.end());
Следует отметить, что концепции являются неофициальными объектами, используемыми в стандарте C++ и различных других документах. Язык не поддерживает понятия напрямую ( еще ).