在将二进制数据写入ostream时减少代码

时间:2014-05-23 06:21:53

标签: c++ c++11 ostream

我有以下代码:

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

现在这是一些应该相当简单和简单的代码。我想知道是否有一种方法可以用更少的代码在功能上编写相同的东西;最好有这样的界面:

ostream.write(bone.parent_index);

我对C ++ 11标准库中的任何解决方案持开放态度或提升。

1 个答案:

答案 0 :(得分:4)

对于简单类型(以及按值存储所有属性的结构),模板方法可以正常工作,自动包装对象:

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

在创建时采用ostream的适配器中。你像这样使用它

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)。