バイナリ メッセージを表す構造体があります。バッファから次のそのようなレコードを取得する関数を書きたい (ファイルかソケットかは関係ありません):
template <typename Record>
Record getNext();
今、私はこれを次のように書くことができます:
template <typename Record>
Record getNext() {
Record r;
populateNext(reinterpret_cast<char*>(&r), // maybe ::read()
sizeof(r)); // or equivalent
return r;
}
これは素晴らしいことであり、RVO の利点を私に与えてくれます。ただし、のデフォルト コンストラクターがRecord
呼び出されます。これは、回避したい機能を実行する非自明なデフォルト コンストラクターを持つ型で構成されている可能性があります。これらは必ずしも POD 型ではありませんが、標準レイアウトです。
getNext()
コンストラクター (デフォルトまたはコピー/移動) を回避するように記述する方法はありますRecord
か? 理想的には、ユーザーが呼び出すとき:
auto record = getNext<Record>();
バッファは のメモリに直接読み込まれますrecord
。これは可能ですか?