2017-08-18 12 views
0

なぜ非const参照ですか?なぜmake_nvpに非const参照が必要ですか?

template<class T> 
const nvp<T> make_nvp(const char * name, T & t); 

私はパブリックフィールドを持つ構造体を持っているため、プライベートフィールドにしてアクセサーを使用する必要があります。だから私は一時的な変数を使用して、make_nvpにそれらを渡すことが許可されているかどうかを知りたい、または私はデータ構造と私のシリアライザをbefriendする必要があります。

// option 1 
auto a = data.getA(); 
ar & make_nvp("A", a); 

// option 2 
ar & make_nvp("A", data._a); // _a is private, but serializer is friend 

私はそれがこの非const性を利用して、後で使用するためにそれを保存し、option 1に問題がある可能性がいくつかのケースではので、それは、テンプレートパラメータだから、このarが何であるかを知りません。

+1

ブーストアーカイブでは、シリアライズとデシリアライズの両方に単一の機能を使用できます。これは、アーカイブをテンプレート引数として使用することによって実現されます。これは、構造体を直列化する出力アーカイブまたは構造体をロードする入力アーカイブにすることができます。非直列化のために、関数は非直列化参照を必要とします。なぜなら 'make_nvp'は非const参照を必要とするのです。 – pschill

+0

@pschillあなたのコメントが好きです。あなたは答えに回りたいと思うかもしれません。私はそれを受け入れます。 – Yola

答えて

2

ブーストアーカイブでは、シリアライズとデシリアライズの両方に単一の機能を使用できます。これは、アーカイブをテンプレート引数として使用することによって実現されます。これは、構造をシリアル化する出力アーカイブまたは構造体を一部のファイルからロードする入力アーカイブにすることができます。非直列化のために、関数は非直列化参照を必要とします。したがって、make_nvpは非const参照を必要とします。

質問に戻ると、オプション1はデシリアライズを解除するため、オプション2が理にかなっています。

0

オプション1はオブジェクトトラッキングを中断し、data._aまたはその内部へのポインタをシリアル化しない限り問題ありません。

関連する問題