BOOST_FOREACH & Vorlagen ohne typedef
Wenn ich mit BOOST_FOREACH, gibt es nicht ein problem mit einfachen Vorlagen als Vektor. Aber wenn ich versuche, Durchlaufen Karte > zum Beispiel muss ich Typdefinition für den Typ des Elements.
Gibt es Abhilfe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein problem, da es ein makro ist, und deshalb nicht in den Griff-Typen mit Kommas (Präprozessor weiß nicht, über templates).
Können Sie auch deklarieren Sie die variable vor der Schleife, siehe Dokumentation.
Edit:
Gibt es eine weitere Komplikation mit
std::map
im besonderen:value_type
ist nichtstd::pair<Key, Value>
, aberstd::pair<const Key, Value>
.Daher, wenn Sie gehen mit der typedef, eine richtige Weg (und der einzige Weg, wenn Sie wollen, zu einem Referenz in der foreach-Schleife), ist die Verwendung
Aber das wird nicht funktionieren, wenn man eine variable deklariert werden, bevor die Schleife, da man nicht zuordnen
std::pair<const int, double>
Instanz später (kann es nicht zuordnen, und die const-Feld), in dem Fall können Sie nur verwendenpair<int, double>
als boost Benutzerhandbuch zeigt.Wenn Sie brauchen, um die Iteration über eine Karte, die einfachste Möglichkeit ist die Verwendung von Tupeln, da bekommen die richtige Art, um typedef, ist lästig. Hier ist wie Sie verwenden können Tupel:
Nur ein Hinweis, das Komma wird hier zu arbeiten, weil die Klammern platziert werden um Schlüssel und Wert. Der Präprozessor versteht nur Kommas und Klammern(und c99 erfordert, es zu verstehen Anführungszeichen auch). So kann es nicht analysieren, die
<>
imstd::pair<int, double>
. Wir können jedoch die Klammern zu helfen, den Präprozessor. Zum Beispiel, wenn wir eine Funktion zurückgibt, die ein container, der heißt so:So, wir können Klammern um einen Ausdruck und es wird helfen, den Präprozessor:
Jedoch, im Fall einer Karte, können wir keine Klammern um die Erklärung(denn es ist nicht ein Ausdruck). So wird dies nicht funktionieren:
Weil es verwandelte sich in etwas wie dieses
(std::pair<int, double> p) = *it
, und dass, natürlich, falsch ist C++. Aber mit einer Band arbeiten:Wir brauchen nur zu erklären, Schlüssel und Wert auch außerhalb der Schleife(wie oben gezeigt). Plus, es kann den loop haben aussagekräftige Namen. Schreiben Sie
key
stattp.first
, undvalue
stattp.second
.BOOST_FOREACH_PAIR
ist eine weitere option, die gut funktioniert auf unsere Erfahrung:http://lists.boost.org/Archives/boost/2009/09/156345.php
http://lists.boost.org/Archives/boost/2009/09/156366.php
Dies kann so einfach wie diese:
Verwendung der C++11 standard, auto ist wie var in C#, wird es