SPA там сложно быть внимательным, куча одинаковых строчек кода - глаза разбегаются причем от этой копипасты можно было бы избавиться и сделать код понятнее у меня код для сериализации выглядит примерно так Код (Text): template<typename Archive> class basic_iarchive { friend class serialization::type_mux; // get the most derived type ptr Archive* This() { return static_cast<Archive*>(this); } protected: basic_iarchive() {} //векторы template<typename valueT> void copy(std::vector<valueT>& t) { type_mux::detect_array_type<valueT>::type::copy( *This(),&t.front(),t.size(),sizeof(valueT)); } //другие типы template<typename T> void copy(T& t) { type_mux::detect_type<T>::type::copy(*This(),t); } public: typedef boost::mpl::true_ is_loading; typedef boost::mpl::false_ is_saving; template<typename T> Archive& operator>>(T& t) { This()->copy(t); return *This(); } template<typename T> Archive& operator& (T& t) { This()->copy(t); return *This(); } }; Код (Text): class type_mux { public: //простые типы: делегируем сериализацию потомку struct simple_type { template<typename Archive,typename T> static void copy(Archive& ar, T& t) { ar.copy_binary(&t,sizeof(T)); } }; //указатели: рекурсивно сериализуем значение по указателю struct pointer_type { template<typename Archive,typename T> static void copy(Archive& ar, T& t) { ar.copy(*t); } }; //массивы простых типов: сериализуем весь массив целиком struct array_of_simple_type { template<typename Archive,typename T> static void copy( Archive& ar, T* it, int n, int d ) { ar.copy_binary(it,n*d); } }; //массивы сложных типов: рекурсивно сериализуем каждый элемент struct array_of_compound_type { template<typename Archive,typename T> static void copy( Archive& ar, T* it, int n, int /*d*/ ) { for(int i=0;i<n;++i) ar.copy(*it++); } }; //массивы: сериализуем в зависимости от типа элемента struct array_type { template<typename Archive,typename T> static void copy(Archive& ar, T& t) { typedef boost::remove_extent<T>::type value_type; int d = static_cast<const char *>(static_cast<const void *>(&t[1])) - static_cast<const char *>(static_cast<const void *>(&t[0])); int n = sizeof(t)/d; detect_array_type<T>::type::copy(ar,t,n,d); } }; //классы: сериализуем через глобальную функцию serialize() struct class_type { template<typename Archive,typename T> static void copy(Archive& ar, T& t) { serialize(ar,(T&)t); } }; public: // метакод детектирующий тип переменной template<typename T> struct detect_type { typedef typename boost::mpl::if_< boost::is_arithmetic<T>, simple_type, //else typename boost::mpl::if_< boost::is_base_of<make_simple,T>, simple_type, //else typename boost::mpl::if_< boost::is_array<T>, array_type, //else typename boost::mpl::if_< boost::is_pointer<T>, pointer_type, //else class_type >::type >::type >::type >::type type; }; // метакод детектирующий тип элемента массива template<typename valueT> struct detect_array_type { typedef typename boost::mpl::if_< boost::is_arithmetic<valueT>, type_mux::array_of_simple_type, //else type_mux::array_of_compound_type >::type type; }; };
GoldFinch лень, люди которые сталкивались с кросплатформеным разбором протокола, и так все эти приемы знают, а кто не знает
SPA конечно хороший код писать лень, да и уметь еще надо а копипасту писать просто, только получается почему-то нечитабельно и неюзабельно
GoldFinch мне для доказательства кому то чего то писать код? да я вас умоляю. Я конечно с ума сошел, но не настолько