2010-10-05 101 views
5

我正在尋找一個可以用來轉儲大多數數據結構的API,在c/C++中有嗎?在c/C++中是否有類似PHP的var_dump?

+0

我不這麼認爲:

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

任何序列可以用這個簡單的功能被傾倒的元素。 C/C++不是爲這種東西而設計的。最好你只是在互聯網上自己查看不同的數據類型可以做些什麼等等。 – 2010-10-05 07:54:45

回答

1

boost有一個序列化庫,您可以明確地使用它來使您的數據結構可以丟棄。

如果你想讓它自動發生,你的選擇是黯淡的。一個C++程序可以檢查自己的調試符號,或者編譯一些額外的代碼 - 可能是參考GCC-XML輸出自動生成的,或者使用像OpenC++這樣的工具來自動生成一些元數據。

3

我正在尋找一種可用於轉儲大多數數據結構的API,是否有一個在c/C++中?

簡答:不,沒有。

較長的答案:C++沒有反射。也就是說,在運行時無法分析未知的數據結構。您將必須自己爲任何要轉儲的數據結構編寫轉儲例程,並建立在其數據成員可用的基礎上。

但是,請注意,C++有很多工具可以使它更容易。例如,給定一個簡單的通用模板dump()

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 <>'轉儲set <> s和map <> s。一些併發症轉義字符串,浮點精度.... – 2010-10-05 10:39:15

+0

@Tony:是的,對於地圖和多圖(不適用於集合),確實存在必要的過載。 (沒有專業化,順便說一句,因爲這必須是一個_partial_專業化,我們沒有這個功能模板,因爲它存在重載......),對於其他一些類型,你可能想增加更多的重載。但是,我故意留下這個簡單的例子。它已經讓你感覺很好。 – sbi 2010-10-05 11:30:42

相關問題