В универсальном programming/TMP мире, что такое точно модель / политика и “понятие”?

Я хотел бы знать точные все же сжатые определения этих трех понятий в одном месте. Качество ответа должно зависеть от следующих двух точек.

  1. Покажите простой фрагмент кода для показа то, для как и чего используется понятие/техника.
  2. Будьте достаточно просты понять так, чтобы программист без любого воздействия этой области мог схватить его.

Примечание:

Существует, вероятно, много корректных ответов, так как каждое понятие имеет много различных фасетов. Если будет много хороших ответов, то я в конечном счете превращу вопрос в CW и агрегирую ответы.

- Сообщение принимает редактирование-

Повышение имеет хорошую статью об универсальных концепциях программирования

6
задан Georg Fritzsche 15 May 2010 в 19:58
поделиться

3 ответа

Концепция - это набор требований к типу.Например, у вас может быть концепция под названием «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 от своих моделей.В этом случае было бы просто определить переменную члена индексируемых данных данных .

8
ответ дан 9 December 2019 в 20:43
поделиться

A.o. документация SGI ссылается на "модель" как на то, что было введено в качестве "концептов" в предложении C++0x: это время компиляции, эквивалентное тому, что такое "интерфейс" в моделировании OO. В ней обобщены требования, предъявляемые к общему коду параметра шаблона.

В качестве примера можно сказать, что параметры OutputIterator функции std::transform должны реализовывать operator++() и operator=( T ) для того, чтобы функция работала.

Политика - это другое дело: она делает алгоритм изменяемым извне. Хорошим примером является менее используемый параметр Allocator контейнеров stl: он подсказывает алгоритму, как выделять память. При желании можно сделать std::vector, где вся функция vector выделит память в облаке, а не на куче. (Я не склонен реализовывать этот аллокатор, заметьте).

2
ответ дан 9 December 2019 в 20:43
поделиться

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++ и различных других документах. Язык не поддерживает понятия напрямую ( еще ).

2
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: