1. C++ / Говнокод #19923

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    //Сериализовать структуру со статической информацией о её полях
    template<typename T, typename T0, typename ...Args> void SerializeBinary(
    	const Tuple<T0 T::*, Args T::*...>& members, const T& src, void*& dst)
    {
    	SerializeBinary(src.*members.first, dst);
    	SerializeBinary(members.next, src, dst);
    }
    
    template<typename T, typename T0> void SerializeBinary(
    	const Tuple<T0 T::*>& members, const T& src, void*& dst)
    {
    	SerializeBinary(src.*members.first, dst);
    }
    
    //Десериализовать структуру со статической информацией о её полях
    template<typename T, typename T0, typename ...Args> void DeserializeBinary(
    	const Tuple<T0 T::*, Args T::*...>& members, T& dst, const void*& src)
    {
    	DeserializeBinary(dst.*members.first, src);
    	DeserializeBinary(members.next, dst, src);
    }
    
    template<typename T, typename T0> void DeserializeBinary(
    	const Tuple<T0 T::*>& members, T& dst, const void*& src)
    {
    	DeserializeBinary(dst.*members.first, src);
    }
    
    //Размер структуры в сериализованном виде
    template<typename T, typename T0, typename ...Args> uintptr GetSerializedBinarySize(
    	const Tuple<T0 T::*, Args T::*...>& members, const T& src)
    {
    	return GetSerializedBinarySize(src.*members.first) + GetSerializedBinarySize(members.next, src);
    }
    
    template<typename T, typename T0> uintptr GetSerializedBinarySize(
    	const Tuple<T0 T::*>& members, const T& src)
    {
    	return GetSerializedBinarySize(src.*members.first);
    }

    Сделал свой сериализатор на шаблонах и кортежах с указателями на данные-члены.

    Запостил: gammaker, 03 Мая 2016

    Комментарии (3) RSS

    • привет, std::make_tuple
      Ответить
    • Круто, а данные о рефлексии откуда берёшь-то?
      Ответить
      • #define REFLECTION_TUPLE_FIELD_POINTER_TYPE(clas s, expr) decltype(&class::expr)
        #define REFLECTION_TUPLE_FIELD_POINTER(class, field) {&class::field}
        #define ADD_REFLECTION(...)\
        typedef Tuple<MACRO2_FOR_EACH(REFLECTION_TUPLE_F IELD_POINTER_TYPE, __VA_ARGS__)> MemberPointerTuple;\
        static const MemberPointerTuple& ReflectionMemberFieldPointers()\
        {\
        static const MemberPointerTuple result = {MACRO2_FOR_EACH(REFLECTION_TUPLE_FIELD_ POINTER, __VA_ARGS__)};\
        return result;\
        }

        А реализация MACRO2_FOREACH отсюда: http://www.gamedev.ru/code/forum/?id=213312#m6
        Там он называется ACTION, я просто переименовал.

        В конец определения структуры приписываю ADD_REFLECTION(имя_структуры, поле1, поле2) с перечислением всех полей, и сериализация начинает работать.
        Ответить

    Добавить комментарий