2010-11-05 8 views
11

Załóżmy, że mamy struct w C++:C/C++ Czy można uzyskać "listę" członków instancji, wysyłając zapytanie do klasy?

struct foobar 
{ 
     int age; 
     bool hot; 
     String name 
}; 

Czy istnieje sposób programowo, kwerendy powyżej struct, aby wyodrębnić jego członków instancji? Na przykład:

String[] members = magicClass.getInstanceMembers(foobar); 

Członkowie będą mieć ["age", "hot", "name"] jako jego wartości.

Możliwe? Powodem, dla którego pytam, jest to, że mam konstrukcje, które zmieniają się w czasie (zmienne dodane/usunięte). Chcę móc tworzyć automatycznie generujące pliki Lua z tymi zapisanymi danymi.

Dzięki

+1

Przykro mi z powodu pedanterii, ale muszę zapytać, co to ma wspólnego z C :-) – Christoffer

Odpowiedz

11

Nie, standardowe C++ nie obsługuje tego rodzaju refleksji. Istnieje kilka "hakowatych" sposobów używania makr do tworzenia szablonu typ-typ-esque, który będzie używał SFINAE do statycznego określania, czy dana klasa ma jakąś funkcję danych lub funkcję członka, ale niczego, co faktycznie wyliczy każdego członka klasa.

Rzeczywiście, C++ został zaprojektowany z myślą o pewnej filozofii, która sprawiałaby, że trudno jest, o ile nie przynosi on efektów odwrotnych do zamierzonych, wspierać typ refleksji środowiska wykonawczego, jaką widzimy w językach wysokiego poziomu, takich jak C#/Java. Zobacz Why does C++ not have reflection?, aby uzyskać szczegółową dyskusję na ten temat.

+0

Strzelaj. Kolejny powód, dla którego Java jest królem dla non OS/low level stuff –

+8

@Carlo del Mundo: Właściwie większość ludzi widzi to jako plus. Chociaż refleksja jest bardzo przydatna w budowaniu narzędzi dla programistów. W prawdziwym kodzie nie jest to użyteczne i często prowadzi do strasznego utrzymywania kodu (oczywiście zawsze są wyjątki). –

+1

@Martin, prawda, ale chciałbym zobaczyć lepszą obsługę * czasu kompilacji *, co może pomóc w ulepszeniu projektów bibliotek szablonów. Niezależnie od tego, myślę, że najlepszym przypadkiem refleksji jest wdrożenie ogólnych funkcji serializacji. –

1

Jeśli naprawdę chcesz napisać "C++" kod z refleksji można spojrzeć na to, co ROOT robi z cint i code-generator makecint. Ale to chyba nie jest to, co naprawdę chcesz zrobić ...

Powiązane problemy