1

ブースト再帰バリアントを使用して、生データをencode()関数に渡す必要があるmsgpackを使用してエンコードするバリアントデータを格納しています(以下を参照)。

以下のencode()関数で3つの異なるオプションを試しましたが、機能しません。代替案は何ですか?

typedef std::vector<boost::recursive_variant_> vector_rvariant_t; 
typedef std::map<std::string, boost::recursive_variant_> map_rvariant_t;

typedef boost::make_recursive_variant <bool, boost::uint8_t, boost::uint32_t, 
        boost::int32_t, double, std::string, boost::uuids::uuid,  
        vector_rvariant_t, map_rvariant_t > ::type rvariant_type;

/**
 Wrapper class for boost::make_recuverise_variant<>::type
*/
class rvariant {
public:
   // encode the _data to msgpack buffer 
   //NEED HELP for this function.
    void encode(msgpack::sbuf& sbuf) {
       // msgpack::pack(sbuf, (*type_)data_);
       // msgpack::pack(sbuf, boost::get<typeid(data_)>(data_));
       // msgpack::pack(sbuf, boost::get<*type_>(data_));
    }

    // constructor 
    explicit template <typename T> rvariant(const T& data) {
       data_ = data;
       type_ =  (std::type_info*)&typeid(data);
    }

    // operator=  
   template <typename T> rvariant& operator=(const T& data) {
       data_ = data;
       type_ = (std::type_info*)&typeid(data);
       return *this;
   }

    // get the data 
   template<typename T> T get() {
       return boost::get< T >(data_);
   }

private:
  rvariant_type data_;
  std::type_info* type_;

};
4

1 に答える 1

1

std::type_infoBoost::Variantで機能する方法で使用しているとは思いません。

アイディア:

  1. ここで提供されているものと同様のコードを使用して、呼び出しをラップし、独自のタグをエンコードします。訪問者を使用することにより、基本的にBoost.Variantライブラリのパブリックインターフェイスに制限されます。代替:使用variant.which

  2. boost :: Variantの内部タグ付けとデータストレージは後で変更される可能性があるため、便乗しようとしないでください。Boost.Variantは、コンパイラの機能とテンプレートパラメータのプロパティに基づいて内部データを異なる方法で割り当てる場合があることに注意してください(たとえば、参照型は特別に扱われます)。代わりに、(ステップ1のように)タグを個別にエンコードしてから、(入力された)データを個別にエンコードします。

それがお役に立てば幸いです。短いバージョンはこれだと思います。あなたのアプローチは、私が説明したものよりも直接的ですが、Variantの内部に依存しているため、正しく理解するのが困難です。

編集: Boost.Serializationソースを確認しました。それは役立つかもしれません:http ://svn.boost.org/svn/boost/trunk/boost/serialization/variant.hpp

編集:説明するために(そして答えをより自己完結型にするために)、Boost.Serializationの訪問者は次のようになります(上記のリンクを参照):

template<class Archive>
struct variant_save_visitor : boost::static_visitor<>  {
  variant_save_visitor(Archive& ar) : m_ar(ar) {}

  template<class T>
  void operator()(T const & value) const {
    m_ar << BOOST_SERIALIZATION_NVP(value);
  }
private:
  Archive & m_ar;
};
于 2011-03-26T04:03:26.657 に答える