Wie schreibt man ein Konzept, das die Typen beschreibt, für die die bereichsbasierte for-Schleife aktiviert ist?Wie schreibe ich ein einfaches Bereichskonzept?
Ein Versuch ist:
template < typename Range > concept bool RRange
= requires(Range range) {{std::begin(range),std::end(range)};};
aber, was ich will wirklich etwas, was wie das ist:
template < typename Range > concept bool RRange
= requires(Range range) {{for(auto&& item : range);};}; // compile error
die RRange
ist, das Konzept aller Art zu sein, der Ausdruck for(auto&& item : range);
gilt für . Was ist der beste Weg, dies zu erreichen?
Ich verwende GCC7 Schnappschuss mit g++ -std=c++1z -fconcepts
.
Es ist gut, einen Vorbehalt hinzufügen, dass darauf zurückzuführen, wie die Spezifikation geschrieben werden, Code Benutzer nur einen Best-Effort-Versuch Konzept-ifying machen diese Sprachfunktion (obwohl eine sehr gute). Es gibt (sehr) pathologische Randfälle, die nicht erfasst werden können. –
@LucDanton Ich habe das Konzept neu geschrieben, um auf benannte Variablen zu operieren, wie es der Bereich für Semantik erfordert. Der hinzugefügte Testfall schlägt jedoch fehl, und ich weiß nicht warum. Könnte es ein Randfall sein, wie Sie zuvor erwähnt haben? –
Ich hätte den neuen Testfall mit der vorherigen Lösung nicht auslassen sollen. Ich habe es durch die hinzugefügte 'declref' Indirection behoben. Danke für alles. –