C ++ Cereal Archive Type专业化不起作用

时间:2015-06-10 15:21:06

标签: c++ c++11 cereal

我在VS 2013中使用Cereal 1.1.2。

我已尝试使用此处的类型进行归档专业化示例:http://uscilab.github.io/cereal/archive_specialization.html

但它没有编译错误:

#include "cereal\types\map.hpp" namespace cereal { //! Saving for std::map<std::string, std::string> for text based archives // Note that this shows off some internal cereal traits such as EnableIf, // which will only allow this template to be instantiated if its predicates // are true template <class Archive, class C, class A, traits::EnableIf<traits::is_text_archive<Archive>::value> = traits::sfinae> inline void save(Archive & ar, std::map<std::string, std::string, C, A> const & map) { for (const auto & i : map) ar(cereal::make_nvp<Archive>(i.first, i.second)); } //! Loading for std::map<std::string, std::string> for text based archives template <class Archive, class C, class A, traits::EnableIf<traits::is_text_archive<Archive>::value> = traits::sfinae> inline void load(Archive & ar, std::map<std::string, std::string, C, A> & map) { map.clear(); auto hint = map.begin(); while (true) { const auto namePtr = ar.getNodeName(); if (!namePtr) break; std::string key = namePtr; std::string value; ar(value); hint = map.emplace_hint(hint, std::move(key), std::move(value)); } } } // namespace cereal #include "cereal\archives\json.hpp" #include <iostream> #include <string> #include <fstream> int main() { std::stringstream ss; { cereal::JSONOutputArchive ar(ss); std::map<std::string, std::string> filter = { { "type", "sensor" }, { "status", "critical" } }; ar(CEREAL_NVP(filter)); } std::cout << ss.str() << std::endl; { cereal::JSONInputArchive ar(ss); cereal::JSONOutputArchive ar2(std::cout); std::map<std::string, std::string> filter; ar(CEREAL_NVP(filter)); ar2(CEREAL_NVP(filter)); } std::cout << std::endl; return 0; }

我尝试使用示例中的代码段编译以下代码:

{
    "map": {
        "a": 1,
        "b": 2
    },
    "map_not_string": [
        {
            "key": 1,
            "value": 1
        },
        {
            "key": 2,
            "value": 2
        }
    ]
}

请注意,如果我删除save()函数重载,它会编译。但我的目标是能够使用map键作为JSON键,所以它就像这样:

{{1}}

1 个答案:

答案 0 :(得分:0)

我把这个问题作为谷歌Github的一个问题得到了答案: https://github.com/USCiLab/cereal/issues/197

问题是make_nvp的模板化版本,所以

ar(cereal::make_nvp<Archive>(i.first, i.second));

变为

ar(cereal::make_nvp(i.first, i.second));

文档已更新,因此不再是问题。