gpt4 book ai didi

c++ - 即使有适当的方面,非有限 float 的反序列化也会失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:38 28 4
gpt4 key购买 nike

我需要使用 Boost.Serialization 来序列化 float 。由于 NaN 和 infinites 本身无法从输入流中读取,因此我尝试在 boost/math/special_functions 中使用这些方面。我已经在我的平台上使用类似于我们可以在此处找到的示例的代码对它们进行了测试:http://www.boost.org/doc/libs/1_50_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fp_facets/intro.html但是,以下代码仍然无法正确反序列化非有限浮点值(抛出异常,描述为“输入流错误”)。

#include <limits>
#include <locale>
#include <sstream>

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
#include <boost/serialization/nvp.hpp>

struct Data {
float f;

Data() : f(std::numeric_limits<float>::quiet_NaN()) {}

template <class Archive>
void serialize(Archive & ar, unsigned const)
{
ar & BOOST_SERIALIZATION_NVP(f);
}
};

void test()
{
using namespace boost::archive;
Data d;
std::ostringstream oss;
xml_oarchive oar(oss);
oar << BOOST_SERIALIZATION_NVP(d);
//std::cout << oss.str() << std::endl;
std::istringstream iss(oss.str());
std::locale const new_loc(iss.getloc(), new boost::math::nonfinite_num_get<char>);
iss.imbue(new_loc);
xml_iarchive iar(iss);
iar >> BOOST_SERIALIZATION_NVP(d);
std::cout << d.f << std::endl;
}

我做错了什么吗?我的 Boost 版本或我的平台有问题吗?有更好的解决方案吗?任何帮助将不胜感激。

最佳答案

我通过阅读以下实现说明找到了解决方案: http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/implementation.html#charencoding

当使用默认标志构建存档时,流的区域设置会更改以解决字符编码问题,但可以使用标志 boost::archive::no_codecvt 禁用此机制。

如果我换行

xml_iarchive iar(iss);

xml_iarchive iar(iss, no_codecvt);

然后就可以了。

关于c++ - 即使有适当的方面,非有限 float 的反序列化也会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22203496/

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