6

Ich möchte die genauen, aber prägnanten Definitionen dieser drei Konzepte an einem Ort kennen. Die Qualität der Antwort sollte von den folgenden zwei Punkten abhängen.In der generischen Programmierung/TMP-Welt was genau ist ein Modell/eine Politik und ein "Konzept"?

  1. Zeigen Sie ein einfaches Code-Snippet, um zu zeigen, wie und wofür das Konzept/die Technik verwendet wird.
  2. Seien Sie einfach genug zu verstehen, so dass ein Programmierer ohne Exposition in diesem Bereich es erfassen kann.

Hinweis:

Es gibt wahrscheinlich viele richtige Antworten, da jedes Konzept viele Facetten hat. Wenn gibt es viele gute Antworten, werde ich schließlich die Frage in CW und aggregieren die Antworten.

- Beitrag bearbeiten Accept -

-Boost hat eine schöne article auf generische Programmierkonzepte

Antwort

8

Ein Konzept ist eine Reihe von Anforderungen an einen Typ. Zum Beispiel könnten Sie ein Konzept namens "RandomAccessible" haben, das die Anforderung auf einen Typ setzt, der operator[](int) in O (1) -Zeit implementiert.

Da Konzepte aus dem kommenden C++ - Standard entfernt wurden, existieren sie nur in C++ als Dokumentation. Als Beispiel könnten Sie SGI's description of the Container concept lesen. Wenn ein Typ alle Anforderungen eines Konzepts erfüllt, nennen Sie ihn Modell dieses Konzepts. Zum Beispiel ist std::vector ein Modell des Container-Konzepts (oder äquivalent std::vector "models" Container).

Schließlich ist eine Richtlinie eine Einheit des Verhaltens, die mit anderen Einheiten des Verhaltens kombiniert werden kann, um komplexe Klassen zu erstellen. Angenommen, Sie möchten zwei Klassen erstellen: ein Array fester Größe und ein Array mit dynamisch veränderbarer Größe. Beide Klassen verfügen über viele gemeinsame Funktionen, unterscheiden sich jedoch nur in ihren Speichermechanismen und einigen ihrer Funktionen (z. B. können Sie push_back nicht in einem Array fester Größe aufrufen).

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 
    } 
}; 

Verwendung wäre wie folgt:

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]; 
} 

Offensichtlich ist dies ein sehr grobes und unvollständiges Beispiel ist, aber ich hoffe, dass es das Konzept hinter einer Politik beleuchtet.

Beachten Sie, dass wir in dem Beispiel sagen können, dass fixed_storage und dynamic_storage "Modelle" des Konzepts StoragePolicy sind. Natürlich müssten wir genau definieren, was die Modelle von ihren Modellen verlangen. In diesem Fall wäre es einfach, eine indexierbare data Elementvariable zu definieren.

2

Ein Konzept ist eine Reihe von Anforderungen, die eine Art erfüllen müssen, um das Konzept zu modellieren.

Zum Beispiel kann ein Typ ist TLessThanComparable falls für ein Paar von Objekten und ab vom Typ T der Ausdruck a < b wohlgeformt ist, umwandelbar in bool und induziert eine strenge schwache Ordnungsrelation. Der Typ int ist ein Beispiel für ein Modell von LessThanComparable.

Konzepte können Verfeinerungshierarchien bilden. Das Konzept A ist eine Verfeinerung des Konzepts B, wenn die Anforderungen von A eine Obermenge der Anforderungen von B sind. Zum Beispiel ist BidirectionalIterator eine Verfeinerung von ForwardIterator.

Konzepte werden verwendet, um die Menge von Typen einzuschränken, auf die eine Vorlage spezialisiert werden kann. Zum Beispiel kann der std::sort Algorithmus ein Paar Objekte akzeptieren, solange sie RandomAccessIterator modellieren.

Beachten Sie, dass Konzepte informelle Objekte sind, die im C++ - Standard und verschiedenen anderen Dokumenten verwendet werden. Die Sprache unterstützt Konzepte nicht direkt (yet).

+0

(+1) gut geschrieben: D –

2

A.o. Die SGI-Dokumentation bezieht sich auf "Modell", was als "Konzepte" in einem C++ 0x-Vorschlag eingeführt wurde: Es ist die Kompilierungszeit, die äquivalent zu dem ist, was eine "Schnittstelle" in der OO-Modellierung ist. Es fasst die Anforderungen zusammen, die der generische Code an einen Vorlagenparameter stellt.

Als Beispiel kann man sagen, dass die OutputIterator Parameter der std::transform Funktion operator++() und operator=(T) um implementieren sollten für die Funktion zu arbeiten.

Die Richtlinie ist eine andere Sache: Es macht einen Algorithmus von außen veränderbar. Ein schönes Beispiel ist der weniger verwendete Allocator Parameter der STL-Container: Er teilt dem Algorithmus mit, wie er Speicher reservieren soll.Wenn man möchte, kann man einen std::vector<int, AllocateOnCloud> machen, wo die gesamten vector Funktionen Speicher in der Cloud statt auf dem Heap reservieren würden. (Ich bin nicht dazu geneigt, diesen Allokator zu implementieren).