В мире общего программирования / TMP что такое модель / политика и «концепция»? - PullRequest
6 голосов
/ 06 февраля 2010

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

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

Примечание:

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

- Редактировать после принятия -

У Boost есть отличная статья об общих концепциях программирования

Ответы [ 3 ]

8 голосов
/ 06 февраля 2010

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 переменную-член.

2 голосов
/ 06 февраля 2010

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

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

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

2 голосов
/ 06 февраля 2010

Концепция - это набор требований, которым должен удовлетворять тип, чтобы смоделировать концепцию.

Например, тип T равен LessThanComparable, если для пары объектов a и b типа T выражение a < b правильно сформировано, преобразуется в bool и вызывает строгое слабое отношение порядка. Тип int является примером модели LessThanComparable.

Концепции могут формировать уточняющие иерархии. Концепция A является уточнением концепции B, если требования A являются расширенным набором требований B. Например, BidirectionalIterator является уточнением ForwardIterator.

Понятия используются для ограничения набора типов, с которыми может быть специализирован шаблон. Например, алгоритм std::sort может принимать пару объектов, если они моделируют RandomAccessIterator.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...