Я пытаюсь получить модуль сериализации для классов, использующих ускоренное слияние. Я преобразовал свой класс в последовательность boost::fusion. Этот пример взят из слайдов выступления Майкла Кейса на boostcon 13.
Пример, объясненный Майклом, хорошо работал для типа структуры. То же самое нельзя было применить к типам классов. Что мне здесь не хватает?
#include <iostream>
#include <typeinfo>
#include <string>
#include <boost/fusion/include/sequence.hpp>
#include <boost/fusion/include/algorithm.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/fusion/include/is_sequence.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/type_traits.hpp>
#include <vector>
#include <list>
using namespace std;
template< typename T >
void serialize(T v)
{
boost::fusion::for_each( v, (serial_out()) );
}
struct serial_out
{
template< typename T >
void operator() ( T & v , typename std::enable_if<!boost::fusion::traits::is_sequence<T>::value>::type* = 0 ) const
{
simple::serialize<T>::write(v);
}
template< typename T >
void operator() ( T & v , typename std::enable_if<boost::fusion::traits::is_sequence<T>::value>::type* = 0 ) const
{
serialize(v);
}
template< typename T >
void operator()( std::vector<T> & v ) const
{
simple::serialize<int>::write(v.size());
std::for_each(v.begin(),v.end(),*this);
}
template< typename T >
void operator()( std::list<T> & v ) const
{
simple::serialize<int>::write(v.size());
std::for_each(v.begin(),v.end(),*this);
}
};
namespace simple
{
template<typename T> struct serialize{};
template<> struct serialize<int>
{
static void write(int v) { cout << v << endl; }
};
template<> struct serialize<float>
{
static void write(float v) { cout << v << endl; }
};
template<> struct serialize<std::string>
{
static void write(std::string v)
{
cout << v << endl;
}
};
}
class secret_point
{
public:
secret_point(double x, double y) : x_(x), y_(y) {}
double get_x() const { return x_; }
void set_x(double d) { x_=d; }
double get_y() const { return y_; }
void set_y(double d) { y_=d; }
private:
double x_, y_;
};
BOOST_FUSION_ADAPT_ADT( secret_point, (double, double, obj.get_x(), obj.set_x(val) ) (double, double, obj.get_y(), obj.set_y(val) ) )
int main(int argc, char *argv[])
{
secret_point p(112,233);
serialize(p);
return 0;
}
adt_attribute_proxy
вsimple
был неправильным (это было действительно далеко не просто). Я думаю, что этот новый подход (изменение толькоserial_out
без измененияsimple::serialize
) имеет больше смысла (но Я бы тоже не рассчитывал, что это правильно). - person llonesmiz   schedule 09.04.2014serial_in
const (я думаю, вы можете избежать этого, используяserial_in in(ia);boost::fusion::for_each( v, in );
). Сделал параметрыadt_attribute_proxy
также постоянными. Изменена одна строка в цикле, который заполняет вектор. И изменение, в котором я менее уверен, изменило функцииget_x
,get_y
иget_sp
, чтобы они возвращали ссылку (и соответственно изменили вызовы BOOST_FUSION_ADAPT_ADT). Кажется, это работает, надеюсь, это поможет. - person llonesmiz   schedule 12.04.2014serialize_pod
наsimple_serializer
, кажется, решает эту проблему (вероятно, у вас будет такая же проблема с вашими нагрузками, но у меня нет времени ее тестировать). coliru.stacked-crooked.com/a/28a663f0787f8e09 . - person llonesmiz   schedule 14.04.2014