C ++ 11 bereichsbasierte for-Schleifen ohne Schleifenvariable
In C++ muss ich Durchlaufen, eine bestimmte Anzahl von Zeiten, aber ich brauche nicht eine iteration variable. Zum Beispiel:
for( int x=0; x<10; ++x ) {
/* code goes here, i do not reference "x" in this code */
}
Ich weiß, ich kann dies tun, indem ersetzen Sie "code geht hier" mit einem lambda-Ausdruck oder eine benannte Funktion, aber diese Frage ist speziell für loops.
Ich hatte gehofft, dass die C++11-die range-basierte for-Schleifen helfen würde:
for( auto x : boost::irange(0,10) ) {
/* code goes here, i do not reference "x" in this code */
}
aber die oben genannten gibt eine "unreferenzierte lokale variable", da ich nie explizit Bezug x.
Frage ich mich, ob es eine elegantere Art und Weise zu schreiben, die über for-Schleifen, so dass der code nicht generieren ein "unreferenzierte lokale variable" Warnung.
InformationsquelleAutor der Frage nonagon | 2013-07-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möglicherweise gibt es einen Weg, es zu tun, aber ich sehr viel Zweifel, es wäre mehr elegant. Was haben Sie in, die erste Schleife ist schon der richtige Weg, es zu tun, die Begrenzung des Umfangs/Lebensdauer der loop-variable.
Ich würde Sie einfach ignorieren Sie die Warnung nicht verwendete variable (es ist nur eine Angabe aus dem compiler, dass etwas kann falsch sein, nachdem alle), oder verwenden Sie die compiler-Einrichtungen (sofern verfügbar) , schalten Sie einfach die Warnung an dieser Stelle.
Könnte es möglich sein, mit einer Art von
#pragma
je nach Umgebung, oder einige Implementierungen erlauben Sie, Dinge zu tun wie:Ich habe gesehen, dass
void
trick verwendet, für die verwendeten Parameter in die Funktion stellen.InformationsquelleAutor der Antwort paxdiablo
Bearbeiten jetzt mit 100% weniger-Schleife deklarierte Variablen.
Verwenden Sie es als:
oder
oder
Sehen es live at http://ideone.com/4k83TJ
InformationsquelleAutor der Antwort sehe
Vorausgesetzt
10
ist eine compile-Zeit-Konstante...oder nur
Anderen lächerlichen Methoden:
Schreiben eine Reihe iterator (ich rufe meine
index
), produziert eine Reihe von iterator-auf integral-Typen (ich standardmäßigstd::size_t
). Geben Sie dann ein:denen eine variable verwendet (
_
), sieht aber überaus verwirrend.Anderen verrückten Ansatz wäre es, erstellen Sie eine python-ähnlichen generator. Schreiben Sie ein wrapper-generator, die einen wiederholenden Bereich und erzeugt eine Funktion, die zurückgibt
std::optional
auf dievalue_type
von der Palette ist nicht schwierig.Können wir dann tun:
erzeugt eine temporäre variable als gut, und ist sogar noch stumpfer.
Könnten wir schreiben eine looping-Funktion, die arbeitet auf Generatoren:
denen wir rufen Sie dann gerne:
aber dies erzeugt einige temporäre Variablen in der Funktion, und ist mehr lächerlich als die Letzte, und stützt sich auf Eigenschaften von C++1y, die noch nicht einmal abgeschlossen.
Denen meine versuche, um eine variable zu erstellen-weniger Weg, etwas zu wiederholen, 10-mal.
Aber wirklich, ich würde einfach nur die Schleife.
Können Sie fast sicher blockieren Sie die Warnung durch Tippen
x=x;
Oder schreiben Sie eine Funktion
- und call -
unused(x);
-- die variablex
verwendet wird, und sein name ist im inneren, damit der compiler keine Warnung über es in.Also versuchen Sie dies:
sollte unterdrückt die Warnung, und eigentlich einfach zu verstehen.
InformationsquelleAutor der Antwort Yakk - Adam Nevraumont
Es ist tatsächlich ein Weg, um diese Arbeit zu machen. Alles, was Sie tun müssen, ist die Rückkehr ein
std::array
mit der angegebenen Länge, die von ständigem Ihnen bieten:Ausgabe:
Hier ist eine demo.
Hinweis: Dies wird vorausgesetzt, der Bereich Planer ist eine Compilezeit-Konstante ist, also, wenn Sie auf eine variable zu verwenden, stellen Sie sicher, es ist gültig markiert
constexpr
.InformationsquelleAutor der Antwort 0x499602D2
Es gibt keinen Weg, um eine Palette für Arbeit für einfach Iteration über mehrere Nummern.
C++11-range-based-loops erfordern reichten Ausdruck kann sein:
begin()
undend()
oderbegin()
undend()
(über ADL)Außerdem: Ein Bereich für erzeugt etwas overhead:
erweitert, um
Wo begin_expr und end_expr sind erhältlich über array Inspektion oder
begin()
/end()
Paare.Ich denke nicht, dass das wirklich "sauberer" als eine einfache for-Schleife. Vor allem in Bezug auf die Leistung.
Keine Anrufe, nur eine schlichte Schleife.
Nur so kann ich herausfinden, um es eleganter (wo elegant ist klar unterliegt meiner Meinung nach) ist mit einer Größe oder Datentyp ohne Vorzeichen hier:
InformationsquelleAutor der Antwort Pixelchemist
Schon am besten beantwortet werden, in https://stackoverflow.com/a/21800058/1147505 : wie definieren Sie eine nicht verwendete makro verwendet werden, in Ihrer gesamten Codebasis, die unterdrückt diese Warnung. In einer tragbaren Weise.
InformationsquelleAutor der Antwort user1147505
Meiner Meinung nach, die Sie missbrauchen, die range-based-loop. Die range-based-Loop-Schleife sollte verwendet werden, wenn die Logik ist: "für jedes element in der Auflistung etwas tun". Die ganze Idee ist, um loszuwerden, die index-variable, da es nicht wichtig ist. Wenn Sie eine Sammlung, sollten Sie sich für ein instrument es sich mit den nötigen APIs, um zu ermöglichen, range-basierte iteration. Wenn Sie nicht über eine Sammlung, die Sie haben kein Geschäft zu verwenden range-based-loop (eigentlich ist das, was der compiler impliziert in der nicht-so-informativ). In dieser situation ist eine normale for/while-Schleife ist die Natürliche Wahl.
InformationsquelleAutor der Antwort SomeWittyUsername
Können Sie mit der STL zusammen mit einem lambda-Ausdruck.
Dieser Ansatz funktioniert auch für beliebige Container wie Vektoren oder Listen. Lassen Sie
vector<int> a
dann würde mana.begin()
unda.end()
. Beachten Sie, dass Sie können auch eine Funktion Zeiger anstelle eines lambda-Ausdrucks.Den oben genannten bewahrt Ihre Vorstellung mit einer foreach-Schleife, während nicht darüber beschweren, einen nicht verwendeten parameter.
InformationsquelleAutor der Antwort evnu
diese Werke in GCC und clang und jeder compiler unterstützt die gnu-Attribute:
sollte und kompilieren in c++11 compiler kann aber nicht unterdrückt die Warnung, wenn der compiler nicht erkennen, die der gnu-Attribute.
InformationsquelleAutor der Antwort atb