4

私はこの定義で順序付けられていないマップを使用するプログラムを持っています:

unordered_map<const char*, vector<pair<int, int> >, function<unsigned int (const char *str)> > myMap(30000, hashing);

ここで、ハッシュはキーのハッシュに使用される関数です。私の問題は->この種の構造をシリアル化し、後で逆シリアル化する方法は?私は本当にそれが必要であり、可能な限り高速かつ効率的である必要があります。私はブーストライブラリについて読んでいますが、この種のものでそれらを使用する方法をあまり理解していません。順序付けされていないマップ用のブーストライブラリがあることは知っていますが、明らかに私はそれで何か間違ったことをしていて、コンパイラは多くのエラーをスローします。誰かがこれをシリアル化する方法で動作するサンプルコードを教えてもらえますか?ありがとう。

4

1 に答える 1

10

TL;DRシリアライズはできませんstd::function。代わりに通常の述語クラスを使用してください。


マップのシリアル化は (その種類に関係なく) 簡単です。本質的には次のとおりです。

typedef std::map<std::string, std::string> Map;

void serialize(Serializer& out, Map const& map) {
    out << map.size();
    for (auto const& p: map) { out << p.first << p.second; }
}

Map deserialize(Deserializer& in) {
    Map map;

    size_t size = 0;
    in >> size;

    for (size_t i = 0; i != size; ++i) {
        Map::key_type key;
        Map::mapped_type value;
        in >> key >> value;
        map[key] = value;
    }

    return map;
}

一般的なケースでは、コンパレータとアロケータの両方がステートフルになる可能性があることを除いて?

void serialize(Serializer& out, Map const& map) {
+   out << map.value_compare() << map.get_allocator();

    out << map.size();
    for (auto const& p: map) { out << p.first << p.second; }
}

Map deserialize(Deserializer& in) {
+   Map::key_compare comparator;
+   Map::allocator_type allocator;
+
+   in >> comparator >> allocator;
+
+   Map map(comparator, allocator)

    size_t size = 0;
    in >> size;
    for (size_t i = 0; i != size; ++i) {
        Map::key_type key;
        Map::mapped_type value;
        in >> key >> value;
        map[key] = value;
    }

    return map;
}

したがって、あなたの場合、 Boost.Serialization が処理方法を知っていると仮定するとstd::allocator(ステートレスです)、どのようにシリアル化することになっていstd::function<unsigned int(char const*)>ますか?

回答: は型の消去std::functionを実行し、これは C++ の静的に型付けされた性質 (およびそのイントロスペクションの欠如) と衝突するため、不可能です。タイプが消去されると、通常、それを復元することはできません。

それを検索するための外部手段を持つには、OR の型でコンパレータの型を明示する必要があります。mapいずれにせよ、Boost.Serialization (コンテキストレス) に収めるのは難しいかもしれません。おそらく、通常の述語クラスを使用したほうがよいでしょう。

于 2012-12-14T12:38:03.917 に答える