6

Я хотел бы знать точные, но сжатые определения этих трех концепций в одном месте. Качество ответа должно зависеть от следующих двух моментов.В общем программировании/мире TMP, что такое модель/политика и «концепция»?

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

Примечание:

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

- Сообщение Accept Edit -

Повышение имеет хороший article на общих концепций программирования

ответ

8

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.

2

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

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

+0

(+1) хорошо написано: D –

2

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

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

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