Ist es möglich, zwei Variablen unterschiedlichen Typs im Initialisierungskörper einer for-Schleife in C ++ zu deklarieren?
Beispielsweise:
for(int i=0,j=0 ...
definiert zwei ganze Zahlen. Kann ich im Initialisierungskörper ein int
und ein definieren char
? Wie würde das gemacht werden?
c++
scope
declaration
for-loop
Nathan Osman
quelle
quelle
-std=c++0x
) in Form von möglichfor(auto i=0, j=0.0; ...
, aber diese Möglichkeit wurde in g ++ - 4.5 entfernt, um mit den c ++ 0x-Texten übereinzustimmen.Antworten:
C ++ 17 : Ja! Sie sollten eine strukturierte Bindungsdeklaration verwenden . Die Syntax wird seit Jahren in gcc und clang unterstützt (seit gcc-7 und clang-4.0) ( Beispiel für clang live ). Dies ermöglicht es uns, ein Tupel wie folgt auszupacken:
Das Obige gibt Ihnen:
int i
einstellen1
double f
einstellen1.0
std::string s
einstellen"ab"
Stellen Sie sicher,
#include <tuple>
für diese Art von Erklärung.Sie können die genauen Typen innerhalb
tuple
von angeben, indem Sie sie alle wie bei der eingebenstd::string
, wenn Sie einen Typ benennen möchten. Beispielsweise:Eine spezielle Anwendung davon ist das Durchlaufen einer Karte, um den Schlüssel und den Wert zu erhalten.
Sehen Sie ein Live - Beispiel hier
C ++ 14 : Sie können dasselbe wie C ++ 11 (unten) tun, indem Sie typbasiert hinzufügen
std::get
. Anstelle desstd::get<0>(t)
folgenden Beispiels können Sie also habenstd::get<int>(t)
.C ++ 11 :
std::make_pair
Ermöglicht dies sowiestd::make_tuple
für mehr als zwei Objekte.std::make_pair
gibt die beiden Argumente in a zurückstd::pair
. Auf die Elemente kann mit.first
und zugegriffen werden.second
.Für mehr als zwei Objekte müssen Sie a verwenden
std::tuple
std::make_tuple
ist eine variable Vorlage, die ein Tupel mit einer beliebigen Anzahl von Argumenten erstellt (natürlich mit einigen technischen Einschränkungen). Auf die Elemente kann per Index mit zugegriffen werdenstd::get<INDEX>(tuple_object)
Innerhalb der for - Schleife Körper können Sie einfach alias die Objekte, obwohl Sie noch brauchen , um den Einsatz
.first
oderstd::get
für die for - Schleife Zustand und AktualisierungsausdruckC ++ 98 und C ++ 03 Sie können die Typen von a explizit benennen
std::pair
. Es gibt jedoch keine Standardmethode, um dies auf mehr als zwei Typen zu verallgemeinern:quelle
make_
und schreibenstd::pair(1, 1.0)
.Nein - aber technisch gesehen gibt es eine Umgehung (nicht, dass ich sie tatsächlich verwenden würde, wenn ich nicht dazu gezwungen würde):
quelle
struct { int a=0; char b='a'; } s;
Nicht möglich, aber Sie können:
Oder beschränken Sie den Umfang
f
und diei
Verwendung zusätzlicher Klammern explizit :quelle
Sie können bei der Initialisierung nicht mehrere Typen deklarieren, aber Sie können mehreren Typen EG zuweisen
Erklären Sie sie einfach in ihrem eigenen Umfang.
quelle
Ich denke, der beste Ansatz ist Xians Antwort .
aber...
# Verschachtelt für Schleife
Dieser Ansatz ist schmutzig, kann aber in jeder Version gelöst werden.
Daher verwende ich es oft in Makrofunktionen.
Zusätzliche 1.
Es kann auch verwendet werden, um
declare local variables
undinitialize global variables
.Zusätzliche 2.
Gutes Beispiel: mit Makrofunktion.
(Wenn der beste Ansatz nicht verwendet werden kann, weil es sich um ein For-Loop-Makro handelt)
# If-Anweisungstrick
Wenn Sie auf
0
oder initialisieren möchtennullptr
, können Sie diesen Trick verwenden.aber ich empfehle dies nicht wegen der harten Lektüre.
und es scheint wie ein Fehler.
quelle
Weitere Informationen zum Verschachteln mehrerer for-Schleifen finden Sie unter " Gibt es eine Möglichkeit, Variablen zweier Typen in der for-Schleife zu definieren? ". Der Vorteil des anderen Weges gegenüber Georgs "Strukturtrick" besteht darin, dass Sie (1) eine Mischung aus statischen und nicht statischen lokalen Variablen und (2) nicht kopierbare Variablen haben können. Der Nachteil ist, dass es weitaus weniger lesbar und möglicherweise weniger effizient ist.
quelle
Makro definieren:
Denken Sie daran, dass sich Ihre variablen Bereiche auch auf diese Weise nicht in der for-Schleife befinden.
quelle
{
und in einem separaten Bereich in das Makro einschließen}
.Sie können auch wie unten in C ++ verwenden.
quelle