Zugriff auf den Variablenwert über den String, der den Namen der Variablen in C ++ darstellt [duplizieren]

8

Wenn der Titel nicht klar war, werde ich versuchen zu klären, was ich frage:

Stellen Sie sich vor, ich hätte eine Variable mit dem Namen counter . Ich weiß, dass ich ihren aktuellen Wert sehen kann, indem ich Folgendes tue:

%Vor%

Ich nehme jedoch an, dass ich viele Variablen habe und ich weiß nicht, was ich bis zur Laufzeit sehen möchte.

Kennt jemand einen Weg, wie ich den Wert einer Variablen abrufen kann, indem ich seinen Namen verwende, zum Beispiel:

%Vor%

Ich denke, dass dies das Debuggen großer komplexer Projekte erleichtern könnte.

Vielen Dank im Voraus für Ihre Zeit.

Update: Alle angegebenen Antworten sind gültig und nützlich, der Hauptpunkt ist jedoch, dass Reflektion in C ++ nicht existiert (und nach dem Lesen des empfohlenen Links ist klar, warum).

    
Paul Ridgway 26.05.2010, 08:56
quelle

8 Antworten

10

Wie bereits erwähnt, suchen Sie nach Reflektion in C ++. Das hat es nicht und diese Antwort erklärt warum .

    
Björn Pollex 26.05.2010, 09:07
quelle
4

Sie können einen assoziativen Container als std :: map & lt; std :: string, ihr_variablentyp & gt; um einen String mit einer Variablen zu verknüpfen, vorausgesetzt, sie sind alle vom selben Typ.

Wenn Sie Variablen verschiedener Typen haben, existiert eine Lösung, wie in boost :: variant

    
Nikko 26.05.2010 09:05
quelle
3

Nein, nicht mit C ++ oder seiner Standardbibliothek. Natürlich können Sie etwas hacken, um dieses Verhalten zu emulieren. C ++ erlaubt es Ihnen, Methoden zur Laufzeit auszuwählen, indem Sie Polymorphie verwenden, damit Sie davon profitieren können. Im Wesentlichen erhalten Sie die Methode , die zur Laufzeit anstelle der Variablen aufgerufen wird, und die Methode gibt den Wert vaue zurück:

%Vor%

Alternativ können Sie eine Zuordnung für Zeichenfolgen, die Namen der Werte und dann die Werte mit ihren Namen nachschlagen.

    
wilhelmtell 26.05.2010 09:09
quelle
1

C ++ adressiert alle Variablen über die Adresse, so dass es keine Möglichkeit gibt, nur den Wert einer Variablen anzugeben (Sprachen, die dies ermöglichen, z. B. Python, Perl, haben eine Laufzeit, die diese Informationen enthält)

Sie können etwas implementieren, das die Verwendung eines Namens ermöglicht, um einen Wert zu finden, indem Sie die Werte und ihre Namen in einer std :: map speichern.

    
Mark 26.05.2010 09:05
quelle
1

Nun, wenn Sie wirklich so etwas machen wollen, können Sie versuchen, std :: map (map & lt; string, int * & gt;) zu verwenden. Dies würde Sie auf einen Variablentyp beschränken, sofern Sie sich nicht in eine unschöne Zeigermagie vertiefen. Wie auch immer, es wird hässlich sein und mir vertrauen, dass du diesen Weg wirklich nicht gehen willst. Warum brauchen Sie überhaupt solche Funktion? Verwenden Sie zu Debugzwecken einen Debugger.

    
PeterK 26.05.2010 09:06
quelle
1

Wie bereits gesagt, bietet C ++ keine Reflektion. Sie können jedoch ein eigenes Schlüssel / Wert-Mapping verwenden. Wenn nur ein Werttyp (z. B. int) erforderlich ist, können Sie einen assoziativen STL-Container (Map) verwenden. Wenn Sie mehrere Werttypen unterstützen müssen, empfehle ich einen Blick in die Variante Bibliothek.

    
jopa 26.05.2010 09:45
quelle
0

Dies würde etwas wie Reflektion oder Eval benötigen, das C ++ nicht hat.

    
Andreas Brinck 26.05.2010 09:03
quelle
0

Nein, C ++ bietet diese Möglichkeit nicht. Sie können möglicherweise etwas zusammen mit Makros (oder andere Tricks) hacken, aber es ist wahrscheinlich ziemlich hässlich.

Da ich mir keinen guten Grund für meinen Kopf vorstellen kann, warum das nützlich wäre, könnten Sie uns vielleicht aufklären. Wenn etwas nicht auf eine bestimmte Weise getan werden kann, ist es oft gut, zu den Basisanforderungen zurückzukehren und zu prüfen, ob es einen anderen Weg gibt.

    
paxdiablo 26.05.2010 09:03
quelle

Tags und Links