2

の何らかの汎用バージョンがあればいいのにと思いますstd::istream::readので、これを行うことができます:

ClassA func( std::istream& is ) {
  ClassA a;
  is.read(a);
  return a;
}

また

ClassA func( std::istream& is ) {
  return is.read<ClassA>();
}

または多分:

ClassA::ClassA( std::istream& is ) {
  is.read(data_member);
}

しかし、私は常に次のように独自の一般的な定義を補足する必要があります。

template< class T >
void load( T& v, std::istream& is ) {
  is.read((char*)&v, sizeof(v));
};

template< class T >
T load( std::istream& is ) {
  T v;
  is.read((char*)&v, sizeof(v));
  return v;
};

これを行う際に、ストリーム オブジェクトのメソッドである必要があると思われる場合は、ストリームをパラメーターとして提供する必要があります。

load(a.data_member, is);
// vs
is.read(a.data_member);

この問題について間違って考えているのではないか、あるいは、このようなことを望むのはばかげているのではないかと感じています。read()コンパイラが一般的に推測できるときに、読み取りのサイズについて教えなければならないのはばかげていると思います。

より良い方法はありますか?

4

2 に答える 2

2

関数に問題はありませんload。POD タイプでのみ機能することを覚えておいてください。追加する必要があります。

static_assert(std::is_standard_layout<T>::value, "A must be a POD type.");

また、ストリームで例外をオンにすることを忘れないでください。そうしないと、エラー レポートがまったく得られません。これが、そもそもストリームが構造体に読み込むような方法を提供しない理由です。

于 2013-06-04T16:08:15.347 に答える