gpt4 book ai didi

C++ Cereal 存档类型特化不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:58 25 4
gpt4 key购买 nike

我在 VS 2013 中使用 Cereal 1.1.2。

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

但它没有编译错误:

error C2665:“cereal::make_nvp”:3 个重载中没有一个可以转换所有参数类型...在尝试匹配参数列表时“(const std::string, const std::string )

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

#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;
}

请注意,如果我删除 save() 函数重载,它会编译。但是我的目标是能够把map key当成json key,所以就这样出来了:

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

最佳答案

我把这个问题作为问题提交到 Cereal 的 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));

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

关于C++ Cereal 存档类型特化不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30760616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com