Frage

Ich bin Portierung innerhalb meiner Firma einen Code von einem Projekt zum anderen über, und ich stieß auf eine generische „sets_intersect“ -Funktion, die nicht kompiliert werden:

template<typename _InputIter1, typename _InputIter2, typename _Compare>
bool sets_intersect(_InputIter1 __first1, _InputIter1 __last1,
                    _InputIter2 __first2, _InputIter2 __last2,
                    _Compare __comp)
{
    // Standard library concept requirements
    // These statements confuse automatic indentation tools.
    // concept requirements
    __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
    __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
    __glibcpp_function_requires(_SameTypeConcept<
          typename iterator_traits<_InputIter1>::value_type,
          typename iterator_traits<_InputIter2>::value_type>)
    __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
          typename iterator_traits<_InputIter1>::value_type>)
    __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
          typename iterator_traits<_InputIter1>::value_type,
          typename iterator_traits<_InputIter2>::value_type>)

    while (__first1 != __last1 && __first2 != __last2)
    if (__comp(*__first1, *__first2))
            ++__first1;
    else if (__comp(*__first2, *__first1))
            ++__first2;
    else {
            return true;
    }
    return false;
}

Ich bin neu in diesem Konzept der „Konzepte“ (sorry für das Wortspiel), so habe ich einige stochern in der C ++ Standard-Bibliothek und einige googeln und ich kann sehen, dass diese __glibcpp_function_requires Makros __glibcxx_function_requires verändert wurden. So fixiert, dass mein Compiler-Fehler; Da dies jedoch ist neu für mich, ich bin gespannt, was dieser Code ist für mich tun, und ich habe Probleme, alle Unterlagen zu finden oder Entschlüsselungs den Code in der Bibliothek.

Ich gehe davon aus, dass der Punkt dieses Makros das ist, wenn der Compiler die Templat-Funktion erweitert wird diese eine Art Überprüfung zur Compile-Zeit zu sehen, ausgeführt werden, wenn der Behälter verwendet wird, mit diesem Algorithmus kompatibel ist. Mit anderen Worten, ich gehe davon aus dem ersten Anruf prüft, dass _InputIter1 zum _InputIteratorConcept entspricht. Bin ich nur verwirrt oder bin ich auf dem richtigen Weg? Auch, warum wurden die Namen dieser Makros in C ++ Standardbibliothek geändert?

War es hilfreich?

Lösung

Sie sind richtig, der erste Anruf, dass _InputIter1 prüft implementiert "InputIterator" Konzept .

Diese Makros sind interne GLIBC Implementierungsdetails (mit einem Unterstrich oder einem Doppelstrich beginnen), deshalb GLIBC Implementierer dürfen sie nach Belieben ändern. Sie werden nicht vom Benutzer-Code soll verwendet werden.

Da „Konzepte“ sind nicht mehr die Teil von C ++ 0x Entwurf, um tragbare Konzept Kontrolle zu haben, sollten Sie einige Drittanbieter-Bibliothek verwenden, wie Boost-Konzept Bibliothek überprüfen.

Andere Tipps

„Konzepte“ waren ein vorgeschlagenes Merkmal für die nächste Version von C++, aber sie waren (relativ) stimmten vor kurzem aus dem Standard wird so nicht für Zitat jetzt einige Zeit wieder auftauchen.

Sie entwerfen wurden frühe Überprüfung der Anforderungen für die Template-Parameter und unter anderem zu ermöglichen, hätte viel mehr prägnante Fehlermeldungen aktiviert, wenn ein Typ, der die erforderlichen Constraints nicht erfüllten wurde verwendet, um eine Vorlage zu instanziieren.

2. Edit: (sehen Kommentare von dribeas und Jerry Coffin) Diese g ++ Makros sind ein internes Konzept Mechanismus Kontrolle und sind nicht direkt mit der vorgeschlagenen neuen Sprache-Funktion mit dem gleichen Namen im Zusammenhang. Da sie intern zu g ++ sind, können Sie (und vielleicht sollen), um sie sicher entfernen ohne Verlust an Funktionalität in Ihrer Funktion Vorlage.

Es gibt zwei Konzept Konzepte um (Wortspiel beabsichtigt). Der Standard wie es definiert wird, hatte einen Vorschlag für Konzepte als Standard-Sprache-Funktion, die in der Zusammenstellung helfen würde, und ... es gibt ziemlich viel Literatur um etwa C ++ 0x Konzepte, Diskussionen .. .

Die andere Konzept Konzept ist, die Sie haben gerade getroffen. Die STL, die mit g ++ Implementierungen implementiert wird tut Implementierer spezifische Kontrollen, die auch bei der Fehlererkennung unterstützen sollen. Diese unterscheiden sich von den bisherigen Konzepten dadurch, dass sie keine Sprache-Funktion sind und nicht von Programmierern verwendet werden soll, sondern sie werden intern in der Bibliothek verwendet. Wie die Namen reserviert sind (sie beginnen mit Doppelstrich) die Compiler / Bibliothek Implementierer frei ist nichts hinzuzufügen gibt, solange das Verhalten der Bibliothek nicht von dem, was dem Standard definiert unterscheidet.

Gehen wir zurück zu dem, was Sie tun: Der Code, den Sie in den Hafen zu einem neueren Compiler versuchen, ist eine modifizierte Version von std::set_intersect wie in der Norm [lib.set.intersection] definiert nur zurückkehren, ob sie ohne schneiden sich mit die ganzen zwei Bereiche zu analysieren. Ich würde entweder die Standard-Version verwenden und prüfen, ob der Output-Iterator nicht geändert wurde, oder wenn es ein Performance-Problem ist, umzusetzen, ohne das Konzept überprüft, abhängig von Nicht-Standard-versteckt-Compiler definierten Symbolen für die Wartung Probleme zu fragen, wenn der Compiler Upgrade . Aber das wissen Sie bereits.

Wie Charles bereits darauf hingewiesen, direkte Unterstützung für Konzepte im Rahmen von C ++ 0x wurde aus der Sprache vor relativ kurze Zeit entfernt, und sie wird mit ziemlicher Sicherheit nicht einmal bis zur nächsten Runde der Standardisierung überdacht werden. Hoffentlich dann wird es mehr Einigkeit darüber, was sie eigentlich sein sollte / tun.

Eine ganze Reihe von Bibliotheken versuchen, obwohl ähnliche Fähigkeiten zur Verfügung zu stellen. Konzept Bibliothek Erhöhung prüfen wahrscheinlich ist das offensichtlichste, und ich glaube, die meisten anderen sind auf ihr basiert, zumindest vom Konzept her (wenn Sie das Wortspiel verzeihen werde). Wie, warum entschieden sich die g ++ Jungs von ‚* cxx‘ ändern zu ‚* CPP‘, kann ich nicht einmal ansatzweise zu erraten - außer, dass sie die Abwärtskompatibilität so oft wie möglich zu denken scheinen zu brechen ist eine gute Sache (obwohl diese sind wirklich nur für den internen Gebrauch bestimmt, so den Namen zu ändern nicht brechen viel, aber ihren eigenen Code).

Dies ist auch ziemlich ähnlich wie die Grundidee von dem, was Andrei Alexandrescu präsentierte in §2.1 von Modern C ++ Design . Wenn Sie eine Vorstellung davon, wie wollen Konzept Überprüfung Ihrer eigenen zu schreiben, möchten Sie vielleicht, dass (wie auch §2.7, wo er ähnliche Techniken zur Prüfung auf Umsetzbarkeit und Vererbung gilt) lesen. Während die Konzepte vielfältig geprüft werden, tun diejenigen, die eine gute Arbeit bei der die meisten grundlegenden Techniken zu erklären, so:

  1. stehen Sie eine gute Chance von Lesen und Verstehen Konzept-Überprüfung Vorlagen
  2. < li> Wenn Sie jemals einige Ihrer eigenen entscheiden zu schreiben, Ihnen einen Ausgangspunkt haben

Edit: Es ist wahrscheinlich erwähnenswert, dass die Standard-Bibliotheken für die meisten aktuellen C ++ Compiler zumindest eine Art von Konzept-Überprüfung Vorlagen enthalten. Offensichtlich Gnu tut. Das Gleiche gilt für Comeau. In der Tat, ich der einzige der das scheint nicht denken, so etwas umfassen mehr ist MS VC ++ (die die Dinkumware Bibliothek verwendet). Sie haben auf einige (ziemlich teuer) Laufzeit-Debugging statt in erster Linie konzentriert. Dies ist auch ein wenig nützlich, aber in einer ganz anderen Richtung, und die beide sich nicht gegenseitig überhaupt aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top