如何DE /序列化地图使用boost ::多precision模板类:: mpq_rational [英] How to de/serialize a map with template class using boost::multiprecision::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屋!