其他分享
首页 > 其他分享> > c-增强mpfr_float的序列化

c-增强mpfr_float的序列化

作者:互联网

我想序列化一个包含boost :: multiprecision :: mpfr_float作为成员的自定义类.如果至少5个属性之一为true,则Boost.Serialization文档中的here表示类型T可序列化,而Multiprecision文档中的here则数字类具有直通支持,要求基础后端可序列化.

对于Boost.Multiprecision的mpfr_float类型,我知道:

>这不是原始类型.
>这是一个类类型,但没有定义序列化函数.
>它不是指向可序列化类型的指针.
>它不是对Serializable类型的引用.
>它不是可序列化类型的本机C数组.

因此,如果我要序列化mpfr_float类型,则必须提供该类型的序列化函数.

我的问题是:如何通过自己编写序列化函数来将mpfr_float类型扩展为可序列化?我想我需要访问mpfr后端,并处理基础数据,并且不确定如何继续.有经验的人会给Boost序列化以前未序列化的类的提示,将不胜感激.

结论解决方案

根据sehe的答复,我得出了一个解决方案,它的往返精度很好,精度为100和1000:

namespace boost { namespace serialization { // insert this code to the appropriate namespaces


/**
 Save a mpfr_float type to a boost archive.
 */
template <typename Archive>
void save(Archive& ar, ::boost::multiprecision::backends::mpfr_float_backend<0> const& r, unsigned /*version*/)
{
    std::string tmp = r.str(0, std::ios::fixed);// 0 indicates use full precision
    ar & tmp;
}

/**
 Load a mpfr_float type from a boost archive.
 */
template <typename Archive>
void load(Archive& ar, ::boost::multiprecision::backends::mpfr_float_backend<0>& r, unsigned /*version*/)
{
    std::string tmp;
    ar & tmp;
    r = tmp.c_str();
}

} } // re: namespaces

该解决方案满足了上面第(2)项的需求,表明需要添加序列化功能.谢谢您的帮助.

解决方法:

直通支持意味着您确实必须为后端类型添加序列化.

您可以使用我在此答案中显示的相同方法:

> How to de/serialize a map with template class using boost::multiprecision::mpq_rational

我在哪里展示如何(反)序列化mpq_rational

标签:mpfr,multiprecision,c,serialization,boost
来源: https://codeday.me/bug/20191012/1897529.html