2015-08-18 2 views
6

Wie es in einer Reihe von Gesprächen und Aufsätzen von Andrew Sutton gezeigt, Concepts Lite Vorschlag hat Konzept-basierte Überladung-Funktion und zur gleichen Zeit hat keine Vorstellung von Concept Map, das heißt Template-Argumente werden gegen Konzepte vollständig von einem Compiler überprüft. In Anbetracht dessen ist nicht klar, wie sie ein Problem lösen würden, das in einem Aufsatz von Siek und Gregor aus dem Jahr 2005 beschrieben wurde, "Explicit model definitions are necessary". Kurz gesagt, das Problem konnte mit dem folgenden Zitat aus der Zeitung festgestellt werden.Wie sie Probleme mit Konzept-basierte Überladung ohne explizite Modelle vermeiden (aka Konzept Karten)

So, there are certain input iterator types (such as istream_iterator) that would be misclassified as forward iterators. What is the danger in this? Some algorithms dispatch based on Input_iterator vs. Forward_iterator.

(Es gibt weitere Beispiele neben Iteratoren though.)

Ja, ich bin mir dessen bewusst, dass oben erwähnte Papier als C++ 0x-Konzepte, aber das Problem scheint „generic“ über Konzepte zu sein Vorschläge.

Antwort

3

Der Vorschlag in n3351 A Concept Design for the STL fortgesetzt werden soll Tags typ' verwenden:

concept InputIterator<WeakInputIterator I> = 
    EqualityComparable<I> && 
    Derived<IteratorCategory<I>, input_iterator_tag>; 

In der Syntax für die Aufnahme in den Standard erwartet pro n4377 C++ Extensions for Concepts:

template<typename I> 
concept bool InputIterator = 
    WeakInputIterator<I>() && EqualityComparable<I>() && 
    Derived<IteratorCategory<I>, input_iterator_tag>(); 

Vom ehemaligen Papier:

While C++11 makes it possible to evaluate all static requirements [...] we still need to differentiate some concepts based on their semantic requirements. The iterator category solves that problem for us.

Im Allgemeinen kann man semantische Re ausdrücken durch Prüfen eines Typprädikats (z.B. ein verschachtelter Typ oder eine Konstante oder eine Typ-Funktion), die ausschließlich zum Zweck der Geltendmachung einer Laufzeit-Semantik existiert.

+0

@Columbo Ich habe versucht, es in n4377 Syntax umschreiben; überprüfen Sie bitte, ob ich es richtig gemacht habe (ich habe momentan keinen Zugriff auf einen Compiler mit Konzepten). – ecatmur

+1

Die Syntax, die Sie hatten, war korrekt, aber ein bisschen seltsam darin, dass Sie keinen require-Ausdruck brauchen, wenn Sie nicht auf seine Parameter verweisen müssen. Ich habe es vereinfacht. – Casey

+0

@Casey brilliant, danke. – ecatmur

Verwandte Themen