5

boost :: serializeを使ってboost :: functionをシリアライズしようとしています。なぜならboost :: interprocess :: message_queueで共有したいからです。 私はこれを行うための1つの方法しか見ていません。boost :: serializeの非侵入型を使用することです。どのようにboost :: :: functionをserializeしてmessage_queueに送りますか?

namespace boost { 
namespace serialization { 
     template<class Archive> 
      void serialize(Archive & ar, boost::function<void()> & fct, const unsigned int version) 
     { 
    ar & fct.args; 
    ar & fct.arity; 
    ar & fct.vtable; 
    ar & fct.functor; 
     }  
    } 
} 

vtableとfunctorをシリアライズする必要があります。試していないので、動作しているかどうかはわかりません。

boost :: functionを適切な方法でシリアル化する方法はありますか?

ありがとうございます。

+0

boost :: functionには['target'](http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb)と[' target_type '](http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp39712048-bb)メンバ関数 - 直列化中に使用できます。 –

答えて

4

すぐにはできません。

私は考えることができる2つの問題があります。

  • bindを使用するか、ラムダを作成した場合、たとえば)
  • は、関数のコンテキストを渡す機能のアイデンティティを渡す
は、

どちらも些細なことではなく、どちらもコードにインスツルメンテーションせずに行うことはできません(反射/イントロスペクションと考える)。

ここでは、Commandパターンと、それらのコマンドをシリアル化する方法を示します。

これは、両方のプロセスが共通のコマンドセット(共通のライブラリは良いアイデアのようです)の上に構築され、コマンドのシリアル化とデシリアライズを実装する必要があります。

デシリアライズの場合は、仮想コンストラクタのイディオムを参照することをお勧めします。

+0

それは私にとってとても悪いですが、ありがとう、私はコマンドのパターンについて考えます。 –

2

私はそれを行う方法はないと思います。関数をシリアライズするには、バイナリコードをシリアライズできる必要があります。しかし、コードは少なくともプラットフォームに依存しているため、これは不可能です。

ただし、関数テーブルを作成し、そのテーブルの関数のインデックスをシリアル化することができます。デシリアライザでは、まったく同じテーブルを作成し、シリアル化されたインデックスを使用してテーブルから実際の関数を取得する必要があります。

関連する問題