2010-10-05 2 views
5
Ben en çok veri yapılarını dökümü kullanılabilecek bir API arayan kulüpler

,/C++ c da var mı?c/C++ 'da var_dump PHP gibi bir şey var mı?

+0

: bu basit işlevi kullanılarak atılmış edilebilir herhangi dizisi

template< typename T > inline void dump(std::ostream& os, const T& obj) {os << obj;} 

elemanlar: Örneğin, basit bir jenerik dump() şablonu verilen. C/C++ bu tür şeyler için tasarlanmamıştır. En iyisi, sadece farklı veri tiplerinin neler yapabileceğini internette görüyorsunuz, vb. –

cevap

1

boost açık bir şekilde veri yapıları dumpable yapmak için kullanabileceğiniz bir seri kütüphaneye sahiptir. Eğer daha otomatik gerçekleşmesini istiyorsanız

, seçenekleriniz kasvetli. Bir C++ programı kendi hata ayıklama sembollerini kontrol edebilir veya bazı ekstra kodları derleyebilir - belki GCC-XML çıktısına referansla otomatik olarak oluşturulabilir veya bazı meta verileri otomatik olarak oluşturmak için OpenC++ gibi bir araç kullanabilir.

3

Çoğu veri yapısını dökümlemek için kullanılabilecek bir API'yi arıyorum, c/C++ içinde var mı?

Kısa cevap: Hayır, yok.

Uzun cevap: C++ yansıması yoktur. Yani, çalışma zamanında bilinmeyen veri yapılarını analiz etmenin bir yolu yoktur. Veri üyeleri için mevcut olanlara dayanarak, dökmek istediğiniz veri yapısı için döküm yordamlarını kendiniz yazmanız gerekecektir.

Ancak C++ daha kolay emin olmak için araçların bir sürü vardır unutmayın. Ben öyle düşünmüyorum

template< typename OutIt > 
void dump(std::ostream& os, OutIt begin, OutIt end) 
{ 
    if(begin != end) 
    os << *begin++; 
    while(begin != end) { 
    os << ", "; 
    dump(*begin++); 
    } 
} 
+0

'std :: pair <> 'için <> s ve <> s değerini ayarlamak için bir uzmanlığa ihtiyacınız var. Bazı komplikasyonlar örn. kaçak dizgiler, kayan nokta hassaslığı .... –

+0

@Tony: Evet, haritalar ve multimaps için (kümeler için değil), gerçekten de aşırı bir yükleme gerekli. (Uzmanlık yok, BTW, bu biz fonksiyon şablonları için yok ... aşırı yükleme var, çünkü bir _partial_ uzmanlaşma, olması gerekir gibi) Ve, evet, diğer bazı türleri için daha fazla yüke eklemek isteyebilirsiniz. Ancak, kasıtlı olarak bunu basit bir örnek olarak bıraktım. Zaten sizi halihazırda oldukça uzağa götürüyor. – sbi