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 (コンテキストレス) に収めるのは難しいかもしれません。おそらく、通常の述語クラスを使用したほうがよいでしょう。