2014-05-23 29 views
2

我有以下代碼:寫入二進制數據的ostream時減少了代碼

ostream.write(reinterpret_cast<const char*>(&bone.parent_index), sizeof(bone.parent_index)); 

現在,這是對的東西,應該是相當簡單明瞭了大量的代碼。我想知道是否存在一種使用較少代碼在功能上編寫相同內容的方法;最好有這樣一個接口:

ostream.write(bone.parent_index); 

我打開任何解決方案的C + + 11標準庫或提升。

+3

但是,這只是一行代碼!那麼,你總是可以編寫一個包裝函數... – SingerOfTheFall

+0

它總是可以更小;)如果存在一個我可以在可信庫中使用的包,我寧願不滾動自己的包裝。 –

+1

您可以花很多時間縮小一行,也可以編寫一個包裝函數(@SingerOfTheFall)並返回給程序添加值。我用我用過的所有語言都遇到過這個問題,但它總是一個不同的例子。 – miltonb

回答

4

對於簡單類型(以及存儲由值全部屬性結構),模板方法將正常工作,自動包裝的對象:創建時需要一個ostream適配器內

class MyOStreamAdapter 
{ 
    template <class ObjType> 
    MyOStreamAdapter& write(const ObjType& obj) { 
     ostream.write(reinterpret_cast<const char*>(&obj), sizeof obj)); 
     return *this; 
    } 
    // ... 
} 

。您可以使用它像這樣

char c = 8; 
float f = 8.1; 
int i = 99: 
MyOStreamAdapter os(ostream); 
os.write(c); 
os.write(f); 
os.write(i); 

或本:

char c = 8; 
float f = 8.1; 
int i = 99: 
MyOStreamAdapter os(ostream); 
os.write(c).write(f).write(i); 

這種做法是有限的:在現實世界中,你可能需要特定的類序列化的方法。同時請記住,蒸汽可能連接到具有不同內存佈局的系統(endinanness)。