1

operator>>繰り返しを 定義するのを避けるために、さまざまなファイルから読み取る構造体がたくさんあります。operator<<それぞれについて、次を使用することを考えました。

#include <fstream>

#pragma pack(push, 1)

template<typename Derived>
struct Base
{
    friend std::istream& operator>>(std::istream& stream, Base& base)
    {
        return stream.read(reinterpret_cast<char*>(&base), sizeof(Derived));
    }
    friend std::ostream& operator<<(std::ostream& stream, Base const& base)
    {
        return stream.write(reinterpret_cast<char const*>(&base), sizeof(Derived));
    }
};

struct Foo : public Base<Foo>
{
    int32_t i;
    int8_t j, k, l;
    uint16_t m;
};

struct Bar : public Base<Bar>
{
    int32_t i;
    uint16_t m;
};

#pragma pack(pop)

int main()
{
    Foo foo;
    Bar bar;

    std::ifstream("foobarout", std::ios::binary) >> foo >> bar;
    std::ofstream("foobarout", std::ios::binary) << foo << bar;
}

上記のような単純なPODオブジェクトを、明確に定義された基本クラスへのポインターを使用して読み取り/コピーしています(少なくとも、私が実行している単一のプラットフォームの範囲内では、これは必ずしも移植可能ではないことに気付きます)、または踏んでいますか?薄い氷の上?

4

2 に答える 2

0

ユースケースによっては、Boost Serialization Libraryも参照してください。これは単純なユースケースではやり過ぎに思えるかもしれませんが、このライブラリはさまざまな複雑さのオブジェクトを格納するのに非常に柔軟であることがわかりました。

于 2013-07-24T11:11:45.133 に答える