2009-07-28 10 views
6

boost::variantは値型であると主張しています。これはboost :: variantの生の表現を単純に書き出し、POD型だけを含んでいれば後で読み戻すのが安全だということですか?同じアーキテクチャ上で、同じコンパイラと同じバージョンのboostでコンパイルされたコードによってリロードされると仮定します。raw boost :: variantをシリアル化するのは安全ですか?

また、(おそらく)同様に、boost :: variantを共有メモリで使用できますか?

+1

PODの単なる構造体であっても、生のメモリ表現を吐き出すことは賢明ではなく、コンパイラのパディングレイアウト、アーキテクチャの詳細、およびエンディアンの慈悲に惑わされます。 – Thanatos

+0

当時私は、レイアウトの違いがまったく問題にならない共有メモリの使用にもっと興味を持っていました。 – bdonlan

答えて

6

シリアライゼーションについて:はい。しかし、あなたはboost::variantの訪問メカニズムを使って、そのバリアントに含まれる実際のタイプを書き出してみませんか?共有メモリについて

struct variant_serializer : boost::static_visitor<void> { 
    template <typename T> 
    typename boost::enable_if< boost::is_pod<T>, void>::type 
    operator()(const T & t) const { 
     // ... serialize here, e.g. 
     std::cout << t; 
    } 
}; 

int main() { 

    const boost::variant<int,char,float,double> v('1'); 

    variant_serializer s; 
    boost::apply_visitor(s, v); 

    return 0; 
} 

:あなただけintのような共有メモリにそれを置くことができるようにboost::variantはもちろん、適切な同期を想定し、ヒープ割り当てを実行しません。

あなたが言ったように、上記は、バリアントがPODタイプのみを含むことができる場合にのみ有効です。

+0

私は、実際のタイプを書くために定型コードをたくさん書くのを避けたいと思っています:) – bdonlan

+0

あまり定型的なコードは必要ありません。上記を参照 –

14

boost/serialization/variant.hppを含めてみてください。それはあなたのための仕事です。

+0

これはPODタイプでも機能しますか?ブースト::変形のようなstd :: string – SeniorLee

+0

の見た目はPODタイプではない(さもなければあなたはタグ付きのユニオンを使うことができました)、私はそう思っていますが、クイックテストで確認できます。 – spiderlama

関連する問題