0

私はこのように定義されたクラスを持っています:

template <typename T>
class MyMap
    :public std::map<MyKey, T>
{
    // ...
};

このクラスはメンバーを追加せず、をラップしstd::mapていくつかの補助関数を提供します(便宜上)。

今、私の目標は、このクラスをブーストシリアル化と互換性のあるものにすることです。std::mapつまり、シリアル化をサポートする必要があるだけでなく、同じテンプレートパラメータを使用したのシリアル化とも互換性がある必要があります。

これを達成する方法は?クラスをそのままにしておこうとしました(基本クラスからシリアル化が派生することを期待しています)-コンパイルされません。ベースを呼び出す簡単な実装を追加しようとしましたserialize-コンパイルされません。

また、実装を追加しようとしました。大丈夫ですが、とは互換性がありませんstd::map

何かアイデアはありますか?前もって感謝します。

前もって感謝します。

4

3 に答える 3

1

シリアライゼーションのドキュメントの基本クラスのセクションを読む

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
    ar & boost::serialization::base_object<std::map<MyKey, T>>(*this);

    //Serialize your stuff after the base class
}
于 2013-01-28T19:56:38.977 に答える
0

クラス内で boost::serialization::implementation_level_impl のインスタンス化を強制できます。(これは BOOST_CLASS_IMPLEMENTATION によって作成されたものです)

あなたの場合、次のようなものが機能します:

template <typename T>
class MyMap
    :public std::map<MyKey, T>
{
    boost::serialization::implementation_level_impl<MyMap<T>> temp; //Causes template instantiation
};

namespace boost {                                    
    namespace serialization {      
        template <typename T>
        struct implementation_level_impl< const MyMap<T> >                     
        {                                                    
            typedef mpl::integral_c_tag tag;                 
            typedef mpl::int_< boost::serialization::object_serializable > type;                     
            BOOST_STATIC_CONSTANT(                           
                int,                                         
                value = implementation_level_impl::type::value    
                );                                               
        };                                                   
    }                                                    
}
于 2013-01-28T20:39:13.620 に答える
0

The C++ Standard Library: A Tutorial and Referenceのセクション 6.7 から:

コンテナーを「STL 対応」にする方法は 3 つあります。

  1. 侵襲的アプローチ:

侵襲的および非侵襲的の代わりに、侵入的および非侵入的という用語が使用されることがあります。STL コンテナーが必要とするインターフェースを提供するだけです。特に、begin() や end() などのコンテナーの通常のメンバー関数が必要です。このアプローチは、コンテナを特定の方法で記述する必要があるため、侵襲的です。

  1. 非侵襲的アプローチ:

アルゴリズムと特別なコンテナー間のインターフェイスとして使用される特別な反復子を作成または提供します。このアプローチは非侵襲的です。必要なのは、コンテナーのすべての要素をステップ実行する機能、つまりコンテナーが何らかの方法で提供する機能だけです。

  1. ラッパーアプローチ

前の 2 つのアプローチを組み合わせて、STL コンテナーのようなインターフェイスを使用してデータ構造をカプセル化するラッパー クラスを記述します。

ラッパー アプローチを使用して std::map に追加/異なる機能をサポートする場合は、std::map から継承せずに、マップをラッパー クラス内にカプセル化する必要があります。

于 2013-01-28T20:02:00.243 に答える