如何DE /序列化地图使用boost ::多precision模板类:: mpq_rational [英] How to de/serialize a map with template class using boost::multiprecision::mpq_rational

查看:301
本文介绍了如何DE /序列化地图使用boost ::多precision模板类:: mpq_rational的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下的模板类:

#include <map>
#include <boost/array.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/multiprecision/gmp.hpp>
template <class T>
class A {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
        ar & a;
}
public:
  T a;
};

这是我用它来创建一个映射。

that I use to create a map.

map<A<boost::array<int,2> >, int> mmm;

我可以使用升压序列化提供的头文件/反序列化使用此code:

I can use the header files provided by boost to serialize/deserialize this code using:

 ifstream ifs("filename");
 boost::archive::text_iarchive iarch(ifs);
 boost::serialization::load<boost::archive::text_iarchive,int,A<boost::array<int,2> > >(iarch,mmm,1);

问:我想用的boost ::多precision :: mpq_rational 而不是 INT 数组里面。不过,我得到一个长期的错误与主诉在于gmp_backend没有一个序列化方法:

Question: I would like to use boost::multiprecision::mpq_rational instead of int inside the array. However I get a long error with the main complaint being that gmp_backend does not have a serialize method:

....
/usr/local/include/boost/serialization/access.hpp:118:9: error: ‘struct boost::multiprecision::backends::gmp_rational’ has no member named ‘serialize’
     t.serialize(ar, file_version);
     ^

有一个简单的办法使用boost /系列化/ map.hpp与mpq_rational?
谢谢,

Is there an easy fix using boost/serialization/map.hpp with mpq_rational? Thanks,

推荐答案

还有的直通的为Boost多precision序列化支持:

There's passthrough support for Boost Multiprecision serialization:

数量 debug_adaptor logged_adaptor rational_adaptor
  有通过序列化支持要求底层
  后端可序列化。

后端 cpp_int cpp_bin_float cpp_dec_float float128
  为Boost.Serialization&nbsp全力支持。

Backends cpp_int, cpp_bin_float, cpp_dec_float and float128 have full support for Boost.Serialization.

也就是说,它支持的当且仅当的后台支持它:邮件列表

That is to say, it's supported iff the backend supports it: mailing list:

&GT; 是否/会多precesion有升压支持::系列化

好问题,并没有没有。我想它应该做虽然......很难
  虽然一些后端(如GMP的mpf_t)不要来回并
  从字符串再presentations,并有一个内部结构可能
  不应依赖该等资料: -

您可以:


  • 使用 cpp_rational (因为它是由上面的文档摘抄隐含支持)

  • 使用升压理性:<一href=\"http://stackoverflow.com/questions/22563255/how-to-serialize-boostrational/22564432#22564432\">How序列化的boost ::理性

  • 使用原始 MPZ _ * API序列化,例如见<一href=\"http://stackoverflow.com/questions/21970714/how-to-serialize-a-gmp-rational-number/21973924#21973924\">How序列化GMP有理数?

  • use cpp_rational (as it is supported implicitly by the above doc excerpt)
  • use Boost Rational: How to serialize boost::rational
  • use raw mpz_* API to serialize, see e.g. How to serialize a GMP rational number?

您可以明确地添加对后端(请注意,使用GMP的API将更有效率)的序列化支持

you can explicitly add serialization support for the backend (note that using the gmp API's will be more efficient)

namespace boost { namespace serialization {

    template <typename Archive>
        void save(Archive& ar, ::boost::multiprecision::backends::gmp_rational const& r, unsigned /*version*/)
        {
            std::string tmp = r.str(10000, std::ios::fixed);
            ar & tmp;
        }

    template <typename Archive>
        void load(Archive& ar, ::boost::multiprecision::backends::gmp_rational& r, unsigned /*version*/)
        {
            std::string tmp;
            ar & tmp;
            r = tmp.c_str();
        }

} }

BOOST_SERIALIZATION_SPLIT_FREE(::boost::multiprecision::backends::gmp_rational)


下面是一个演示 住在Coliru 用一个简单的往返测试。

Here's a demo Live On Coliru with a simple roundtrip test.

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/multiprecision/gmp.hpp>
#include <boost/multiprecision/rational_adaptor.hpp>
#include <iostream>

namespace boost { namespace serialization {

    template <typename Archive>
        void save(Archive& ar, ::boost::multiprecision::backends::gmp_rational const& r, unsigned /*version*/)
        {
            std::string tmp = r.str(10000, std::ios::fixed);
            ar & tmp;
        }

    template <typename Archive>
        void load(Archive& ar, ::boost::multiprecision::backends::gmp_rational& r, unsigned /*version*/)
        {
            std::string tmp;
            ar & tmp;
            r = tmp.c_str();
        }

} }

BOOST_SERIALIZATION_SPLIT_FREE(::boost::multiprecision::backends::gmp_rational)

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/array.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/serialization.hpp>
#include <map>

template <class T>
class A {
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & a;
        }

  public:
    T a;
    bool operator<(A const& o) const { return a<o.a; }
};

#include <sstream>

using KeyElement = boost::multiprecision::mpq_rational;
using Key        = A<boost::array<KeyElement,2> >;
using Data       = std::map<Key, int>;

int main()
{
    std::stringstream ss;
    {
        Data mmm { 
            { Key {{{KeyElement { 1, 2 }, KeyElement { 3, 4 }} }}, 5 }, 
            { Key {{{KeyElement { 6, 7 }, KeyElement { 8, 9 }} }}, 42 },
        };
        boost::archive::text_oarchive oa(ss);

        oa << mmm;
    }

    std::cout << "Serialized:\t" << ss.str() << "\n";

    {
        boost::archive::text_iarchive iarch(ss);
        Data mmm; 
        iarch >> mmm;

        std::cout << "Roundtrip:\t";
        boost::archive::text_oarchive oa(std::cout);
        oa << mmm;
    }
}

这篇关于如何DE /序列化地图使用boost ::多precision模板类:: mpq_rational的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆