2010-11-05 14 views
11

++ biz C bir yapı olduğunu varsayalım:C/C++ Bir sınıf sorgulayarak örnek üyelerin "listesini" almak mümkün mü?

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

onun örnek üyeleri ayıklamak için yukarıdaki yapı sorgulamak için, programlama yoluyla bir yolu var mı? Örneğin: değerleri var olarak

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

üye ["age", "hot", "name"] olurdu.

Mümkün mü? Sormamın nedeni, zaman içinde değişen (eklenmiş/kaldırılmış değişkenler) yapılarım olmasıdır. Bu kayıtlı verilerle otomatik üreten Lua dosyaları oluşturabilmek istiyorum.

Teşekkürler

+1

Pedantry için özür dilerim ama bunun C :-) ile ne ilgisi olduğunu sormak zorundayım :-) – Christoffer

cevap

11

Hayır, standart C++ bu yansıma türünü desteklemiyor. Belirli bir sınıfın belirli bir veri üyesine veya üye işlevine sahip olup olmadığını statik olarak belirlemek için SFINAE'u kullanacak türden-özellikli bir şablon oluşturmak için makroları kullanmanın bazı "hacky" yöntemleri vardır, ancak aslında her üyenin bir üyesini sıralayamaz. sınıf. Aslında C++, C#/Java gibi daha yüksek seviyeli dillerde gördüğümüz çalışma zamanı yansıma türünü desteklemek için, karşı üretken olmasa da, bunu zorlaştıracak belirli bir felsefe ile tasarlandı. Bu konu hakkında kapsamlı bir tartışma için bkz. Why does C++ not have reflection?.

+0

Shoot. Java'nın işletim sistemi olmayan/düşük düzeydeki öğeler için kral olmasının bir başka nedeni de –

+8

@Carlo del Mundo: Aslında çoğu insan bunu bir artı olarak görüyor. Her ne kadar geliştirme araçları geliştirici araçları için gerçekten yararlı olsa da. Gerçek kodda bu yararlı değildir ve genellikle kodun korunmasına neden olur (elbette her zaman istisnalar vardır). –

+1

@Martin, ancak şablon kütüphane tasarımlarını geliştirmeye yardımcı olabilecek * derleme zamanı * yansıması için daha iyi destek görmek istiyorum. Ne olursa olsun, en iyi kullanım yansıtma durumunun genel seri hale getirme işlevlerini uygulamak olduğunu düşünüyorum. –

1

Gerçekten, gerçekten ROOTcint ile yapar ve makecint kod üreteci nedir bakabilirsiniz yansıma ile "C++" kod yazmak istiyorum. Ama bu muhtemelen yapmak istediğin şey değil ...

İlgili konular