Durchlaufen Struct und Klasse Mitglieder
Ist es möglich, C++ - Durchlaufen einer Struktur oder Klasse zu finden, die allen Ihren Mitgliedern? Zum Beispiel, wenn ich struct a, und Klasse b:
struct a
{
int a;
int b;
int c;
}
class b
{
public:
int a;
int b;
private:
int c;
}
Wäre es möglich, Schleife, Ihnen zu sagen, ein print-Anweisung zu sagen: "Struct a hat int mit den Namen a, b, c" oder "Klasse b hat int mit den Namen a, b, c"
Keine Reflexion in C++.
Nicht im Allgemeinen. Wenn Sie Sie verlassen haben debugging-Informationen in das Programm ein debugger kann Ihnen diese Informationen, und Sie könnten in der Lage sein, die Verwendung bestimmter Bibliotheken/APIs um zu überprüfen Ihre eigenen binary, aber noch weniger Spaß als, naja, so ziemlich alles...
Eine überlegung Wert, ob dies möglich sein könnte, als ein compile-time-Aktivität unter Verwendung von meta/Vorlage Techniken. Die Informationen sollten verfügbar sein, um die compiler - obwohl möglicherweise benötigen Unterstützung in einer zukünftigen C++ - XX.
Nicht im Allgemeinen. Wenn Sie Sie verlassen haben debugging-Informationen in das Programm ein debugger kann Ihnen diese Informationen, und Sie könnten in der Lage sein, die Verwendung bestimmter Bibliotheken/APIs um zu überprüfen Ihre eigenen binary, aber noch weniger Spaß als, naja, so ziemlich alles...
Eine überlegung Wert, ob dies möglich sein könnte, als ein compile-time-Aktivität unter Verwendung von meta/Vorlage Techniken. Die Informationen sollten verfügbar sein, um die compiler - obwohl möglicherweise benötigen Unterstützung in einer zukünftigen C++ - XX.
InformationsquelleAutor Theopile | 2013-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, dies zu tun, aber Sie brauchen, um zu verwenden einige Makros entweder zu definieren oder anzupassen, die Struktur.
Können Sie die
REFLECTABLE
makro in diese Antwort zu definieren, die eine Struktur wie diese:Und dann kann man die Iteration über die Felder und drucken Sie jeden Wert wie diese:
Andere Möglichkeit ist die Anpassung der Struktur, die als fusion-Sequenz (siehe die Dokumentation). Hier ist ein Beispiel:
Dann können Sie die Felder sowie die Nutzung dieser:
InformationsquelleAutor Paul Fultz II
Nein, es ist nicht möglich, weil es keine Reflexion in C++.
Antworten sollten die Frage beantworten. Die Antwort auf die Frage ist "Nein". Ich meine, die Antwort könnte einen ganzen Mechanismus zu beschriften, eine bestimmte Struktur, so dass jemand kann iteriert werden einige Daten, die seine Felder, aber das noch nicht Durchlaufen der Felder einer struct, die es durchläuft die Felder einer speziell konfigurierten Struktur.
Die Antwort auf die Frage ist nicht 'Nein'. Sie können leicht Durchlaufen der member einer struct und drucken Sie Sie mithilfe von standard-C++:
A a; printf(a.a); printf(a.b); printf(a.c);
. Es gibt viele Möglichkeiten, um die syntax mehr wie die gewünschte "loop", über einige Art von custom reflection-Mechanismus.dein code ist nicht der iteration durch irgendeine vernünftige interpretation der Frage (und es nicht selbst drucken, was der Fragesteller gefragt ;-p). Und es sei denn, Sie zählen können, mit debug-info, benutzerdefinierte Reflexion Mechanismen funktionieren nur auf Strukturen, die wurden irgendwie kommentiert, nicht auf die Beispiel-Strukturen in die Frage und nicht auf die Strukturen, die Sie nicht selbst definieren.
Die Frage stellt keine Beschränkung auf die Kommentierung der Strukturen beteiligt. Ohne Kommentierung
struct a
in irgendeiner Weise, ich kann erklären#define LOOP3(op, s, a, b, c) op(s.a); op(s.b); op(s.c)
undvoid print(int);
, gefolgt vona foo; LOOP3(print, foo, a, b, c);
. Das gleiche kann getan werden, mit Vorlagen, wenn Sie Objekt, um mit dem Präprozessor.InformationsquelleAutor villekulla
Wenn Sie Mitglieder des gleichen Typs (wie Sie in Ihrem ersten spezifischen Beispiel), dass Sie möchten, um sowohl (a) die Namen haben, und (b) werden durchsuchbar, Sie können dann kombinieren Sie ein array mit einem enum:
Dann können Sie beide
Eindeutig nicht eine Allgemeine Lösung, aber ich habe festgestellt, das nützlich für meine eigene Arbeit.
InformationsquelleAutor aquirdturtle