2014-04-04 13 views
6

Herb Sutters genannten eingeschränkten Vorlagen (a.k.a. Concepts Lite) in der Diskussion: Modern C++: What You Need to Know.Was sind eingeschränkte Vorlagen?

Ich weiß, dass Boost seit Ewigkeiten ein Konzeptpaket hat, das es ermöglicht, Fehlermeldungen zu drucken, wenn der Vorlagenabzugsmechanismus keine Operatoren, Funktionen oder Zugriffsverletzungsmuster findet.

Ich habe erwähnt Erwähnungen über die isocpp blog, dass es bereits einen experimentellen Zweig von gcc Implementierung der document proposing Concepts Lite. Beim Durchsehen der aktuellen C++14 draft konnte ich jedoch keine Hinweise finden, ob dies bereits Teil von C++14 sein wird.

So sind die Fragen einfach:

  • werden Konzepte Lite Teil von C++ 14 sein? (Referenz im Standard bevorzugt. Ich konnte einen nicht finden, und ich bin nicht sehr vertraut mit dem Standard.)
  • was ist die korrekte Syntax davon? (Der Vorschlag und die Folien von Herb weichen hier auseinander und ich weiß nicht, welcher aktueller ist)
  • könnten Sie ein minimales Beispiel für eine Abhängigkeit (Prädikat) und eine eingeschränkte Vorlage geben?

HINWEIS: wenn Sie lange genug warten, ich werde versuchen, das gcc Zweig zum Laufen zu bringen und zumindest etwas über die experimentelle Umsetzung sagen, was jedoch nicht für die Richtigkeit der Syntax bedeutet jedoch.

+0

* wird Konzepte Lite Teil von C++ 14 sein? (Referenz im Standard bevorzugt * Was? Es gibt noch keinen C++ 14 Standard. Wie auch immer, nein, sie werden nicht in C++ 14 sein. Ich werde versuchen, eine Referenz/Diskussion zu finden .. – dyp

+2

[Der Vorschlag] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3580.pdf) erklärt es ziemlich gut. Nicht dass es diese Frage illegitim macht, nicht jeder möchte 30 Seiten lesen. – David

+3

[Stroustrup sagt auf seiner Homepage] (http://www.stroustrup.com/C++11FAQ.html#what-concepts), dass sie als ein TR zu C++ 14 enden werden. Nicht sicher, wie up- bis jetzt, dass Informationen sind. – dyp

Antwort

3

Konzepte Lite ist der "Constraints" -Teil eines vollständigen Konzepts für C++. Es ist sehr detailliert in N3701 "Concepts Lite" beschrieben. Kapitel 2 ist ein kurzes Tutorial, das schnell die Kernprinzipien und ihre Anwendung durchläuft, was für Leute, die nicht alle 56 Seiten lesen wollen, großartig ist.

Konzepte Lite wird nicht Teil von C++ 14 sein, es wird später in diesem Jahr als separate technische Spezifikation veröffentlicht. Der letzte Entwurf für den TS-Wortlaut lautet N3929 "Concepts Lite Specification".

Es gibt einige verschiedene Constraint-Syntax-Varianten. Das Codebeispiel, das Kraut im Gespräch verwendet:

auto mean(const Sequence& seq) { 
    auto n = 0.0; 
    for (auto x : seq) 
    n += x; 
    return n/seq.size(); 
} 

wird als „kurz und bündig Syntax“ bezeichnet, da es sich um eine kürzere Äquivalent der ausführlichen Syntax ist:

template <typename __T> 
    requires Sequence<__T>() 
auto mean(const __T& seq) { 
    auto n = 0.0; 
    for (auto x : seq) 
    n += x; 
    return n/seq.size(); 
} 

Beide zeigen, dass die Funktionsvorlage mean kann mit jedem Typ instanziiert werden, der das Sequence Konzept modelliert. Der Einfachheit halber nehmen wir an, dass die Anforderungen für Sequence nur das sind, was unsere Implementierung von mean benötigt: (a) Mitglieder begin & end, die Iteratoren zurückgeben, und (b) Mitgliedsfunktion size, die einen ganzzahligen Typ zurückgibt.

template <typename T> 
concept bool Sequence() { 
    return requires(T t) { 
    {t.size()} -> Integral; 
    {t.begin()} -> InputIterator; 
    {t.end()} -> InputIterator; 
    requires Same<decltype(t.begin()), decltype(t.end())>(); 
    } 
} 

unter der Annahme, straight-forward Definitionen von Integral, InputIterator und Same: Wir könnten das Konzept als definieren.Dieses Konzept Definition wird sichergestellt, dass für einigen erfundenen Wert t des Typs T getestet wird:

  • t.size() ein gültiger Ausdruck ist, und es gibt eine Art, die Modelle das Integral Konzept.
  • t.begin() ist gültig und gibt einen Typ zurück, der InputIterator modelliert.
  • Gleiches für t.end().
  • Der von t.begin() zurückgegebene InputIterator hat den gleichen Typ wie der von t.end() zurückgegebene.
Verwandte Themen