Ich denke an Konzepte als eine Art Meta-Interface. Sie kategorisieren Typen nach ihren Fähigkeiten. Die nächste C++ - Version liefert native Konzepte. Ich hatte es nicht verstanden, bis ich auf die Konzepte von C++ 1x stieß und wie sie es ermöglichen, verschiedene, aber nicht miteinander verwandte Typen zusammenzubringen. Stellen Sie sich vor, Sie haben eine Range
Schnittstelle. Sie können das auf zwei Arten modellieren. Eines ist ein Subtyp Beziehung:
class Range {
virtual Iterator * begin() = 0;
virtual Iterator * end() = 0;
virtual size_t size() = 0;
};
Natürlich jede Klasse, die von diesem leitet die Range-Schnittstelle implementiert und kann mit Ihren Funktionen verwendet werden. Aber jetzt siehst du, dass es begrenzt ist. Was ist mit einem Array? Es ist auch eine Reihe!
T t[N];
begin() => t
end() => t + size()
size() => N
Leider können Sie kein Array von dieser Range-Klasse ableiten, die diese Schnittstelle implementiert.Sie benötigen eine zusätzliche Methode (überladen). Und was ist mit Containern von Drittanbietern? Ein Benutzer Ihrer Bibliothek möchte möglicherweise ihre Container zusammen mit Ihren Funktionen verwenden. Aber er kann die Definition ihrer Container nicht ändern. Hier Konzepte kommen in Spiel:
auto concept Range<typename T> {
typename iterator;
iterator T::begin();
iterator T::end();
size_t T::size();
}
Nun, sagen Sie etwas über die unterstützten Operationen eines Typs, die erfüllt werden kann, wenn T
die entsprechenden Mitgliedsfunktionen. In Ihrer Bibliothek würden Sie die Funktion generisch schreiben. Auf diese Weise können Sie jede Art akzeptieren solange es die erforderlichen Operationen unterstützt:
template<Range R>
void assign(R const& r) {
... iterate from r.begin() to r.end().
}
Es ist eine großartige Art von Ersetzbarkeit. Jeder Typ passt zu der Rechnung, die dem Konzept entspricht, und nicht nur zu den Typen, die aktiv eine Schnittstelle implementieren. Die nächste C++ Standard-geht weiter: Es definiert ein Container
Konzept, das durch reines Arrays passen wird (durch etwas caled Konzept Karte die definiert, wie eine Art etwas Konzept paßt) und andere, bestehende Standardcontainer.
Der Grund, warum ich das oben bringen, weil ich einen Templat-Behälter haben, wo die Behälter selbst eine hierarchische Beziehung haben. Ich möchte Algorithmen schreiben, die diese Container verwenden, ohne sich darum zu kümmern, um welchen speziellen Container es sich handelt. Außerdem würden einige Algorithmen von dem Wissen profitieren, dass der Schablonentyp bestimmten Konzepten (z. B. vergleichbar) entspricht.
Sie können beide mit Vorlagen tatsächlich tun. Sie können Ihre hierarchische Beziehung weiterhin verwenden, um Code freizugeben, und dann die Algorithmen in generischer Form schreiben. Zum Beispiel, um zu kommunizieren, dass Ihr Container vergleichbar ist. Das ist wie Standard-Random-Access/Vorwärts/Ausgang/Eingang Iteratorkategorien sind implementiert:
// tag types for the comparator cagetory
struct not_comparable { };
struct basic_comparable : not_comparable { };
template<typename T>
class MyVector : public BasicContainer<T> {
typedef basic_comparable comparator_kind;
};
/* Container concept */
T::comparator_kind: comparator category
Es ist eine vernünftige einfache Art und Weise, es zu tun, eigentlich. Jetzt können Sie eine Funktion aufrufen und sie wird zur korrekten Implementierung weitergeleitet.
template<typename Container>
void takesAdvantage(Container const& c) {
takesAdvantageOfCompare(c, typename Container::comparator_kind());
}
// implementation for basic_comparable containers
template<typename Container>
void takesAdvantage(Container const& c, basic_comparable) {
...
}
// implementation for not_comparable containers
template<typename Container>
void takesAdvantage(Container const& c, not_comparable) {
...
}
Es gibt tatsächlich verschiedene Techniken, die verwendet werden können, um das zu implementieren. Eine andere Möglichkeit besteht darin, mit boost::enable_if
verschiedene Implementierungen jedes Mal zu aktivieren oder zu deaktivieren.
C++ 1x? Bedeutet das, dass sie es aufgegeben haben, den neuen Standard in diesem Jahrzehnt zu veröffentlichen, oder sprechen Sie von der zukünftigen C++ - Entwicklung? – jpalecek
http://www.research.att.com/~bs/C++0xFAQ.html#concepts – jmucchiello
jpalecek, sie wollen es im Jahr 2010 veröffentlichen. Ich habe die Angewohnheit, es C++ 1x zu nennen :) –