【问题标题】:Reducing code when writing binary data to ostream将二进制数据写入ostream时减少代码
【发布时间】:2014-07-12 09:40:05
【问题描述】:

我有以下代码:

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

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

ostream.write(bone.parent_index);

我愿意接受 C++11 标准库或 boost 中的任何解决方案。

【问题讨论】:

  • 但是,但是……这只是 1 行代码!好吧,你总是可以写一个包装函数...
  • 它总是可以更小;)如果有一个我可以在受信任的库中使用的包装器,我宁愿不滚动我自己的包装器。
  • 您可以花费大量时间来缩小一行,或者您可以编写一个包装函数 (@SingerOfTheFall) 并返回为您的程序增加价值。我用过的所有语言都遇到过这个问题,但情况总是不同。
  • 我认为,只要内存模型在媒体之间发生变化,二进制副本就会很危险,而且不按值存储所有成员的结构也很少见。如果您只有平面数据并且没有跨越系统边界,那么我在下面的回答可能会有所帮助。

标签: c++ c++11 ostream


【解决方案1】:

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

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

这种方法是有限的:在现实世界中,您可能需要特定于类的序列化方法。另请注意,steam 可能会连接到具有不同内存布局的系统 (endinanness)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多