2014-05-23 31 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)。