Re[6]: Уменьшить объем сериализации
От: k732  
Дата: 21.06.08 17:43
Оценка:
Здравствуйте, Sergey, Вы писали:

S>k732 пишет:


>> Ну пусть хоьб 1 раз. Но проблемма в шаблонном классе. Можно ли ее

>> разрешить ?


S>Попробуй ченить в таком роде:

S>
S>namespace boost { namespace serialization {
S>template<typename T, unsigned int X> struct version<Averager<T, X> >
S>{
S>    typedef mpl::int_<20> type;
S>    typedef mpl::integral_c_tag tag;
S>    BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value);
S>};
S>}}
S>


S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто

S>
S>namespace boost { namespace serialization {
S>template<typename T, unsigned int X> struct version<Averager<T, X> >
S>{
S>     enum { value = 20};
S>};
S>}}
S>


большое тебе человеческое. Вроде сработало
Правда не совсем понятно зачем так сложно пришлось и что это означает (в смысле объяснения)
Re[7]: Уменьшить объем сериализации
От: Sergey Россия  
Дата: 21.06.08 19:04
Оценка: 1 (1)
k732 пишет:

> S>namespace boost { namespace serialization {

> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
> S>{
> S> typedef mpl::int_<20> type;
> S> typedef mpl::integral_c_tag tag;
> S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value);
> S>};
> S>}}
> S>
>
>
>
> S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто
> S>
>
> S>namespace boost { namespace serialization {
> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
> S>{
> S> enum { value = 20};
> S>};
> S>}}
> S>
>
>
>
> большое тебе человеческое. Вроде сработало
> Правда не совсем понятно зачем так сложно пришлось и что это означает (в
> смысле объяснения)

Ну вообще если посмотреть в файл version.hpp, то там написано:
namespace boost {
namespace serialization {

struct basic_traits;

// default version number is 0. Override with higher version
// when class definition changes.
template<class T>
struct version
{
     template<class U>
     struct traits_class_version {
         typedef BOOST_DEDUCED_TYPENAME U::version type;
     };

     typedef mpl::integral_c_tag tag;
     // note: at least one compiler complained w/o the full qualification
     // on basic traits below
     typedef
         BOOST_DEDUCED_TYPENAME mpl::eval_if<
             is_base_and_derived<boost::serialization::basic_traits,T>,
             traits_class_version<T>,
             mpl::int_<0>
         >::type type;
     BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
};

} // namespace serialization
} // namespace boost


Означает это, как и написано в комменте, что по дефолту версия равна 0.
Т.е., выражение boost::serialization::version<some_type>::value имеет
значение 0, если не определена соответствующая специализация. Макрос

#define BOOST_CLASS_VERSION(T, N)                                      \
namespace boost {                                                      \
namespace serialization {                                              \
template<>                                                             \
struct version<T >                                                     \
{                                                                      \
     typedef mpl::int_<N> type;                                         \
     typedef mpl::integral_c_tag tag;                                   \
     BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value); \
};                                                                     \
}                                                                      \
}


как раз и определяет такую специализацию. Соответственно, чтобы задать
версию для шаблона, можно написать частичную специализацию структуры
version — это код который я приводил в прошлый раз.

Зачем нужны typedef mpl::int_<N> type; и typedef mpl::integral_c_tag
tag; — понятия не имею, предполагаю что низачем.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: Уменьшить объем сериализации
От: k732  
Дата: 21.06.08 19:10
Оценка:
Здравствуйте, Sergey, Вы писали:

S>k732 пишет:


>> S>namespace boost { namespace serialization {

>> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
>> S>{
>> S> typedef mpl::int_<20> type;
>> S> typedef mpl::integral_c_tag tag;
>> S> BOOST_STATIC_CONSTANT(unsigned int, value=version::type::value);
>> S>};
>> S>}}
>> S>
>>
>>
>>
>> S>Не знаю, на кой ляд там mpl-ные штуки, наверное можно написать просто
>> S>
>>
>> S>namespace boost { namespace serialization {
>> S>template<typename T, unsigned int X> struct version<Averager<T, X> >
>> S>{
>> S> enum { value = 20};
>> S>};
>> S>}}
>> S>
>>
>>
>>
>> большое тебе человеческое. Вроде сработало
>> Правда не совсем понятно зачем так сложно пришлось и что это означает (в
>> смысле объяснения)

S>Ну вообще если посмотреть в файл version.hpp, то там написано:

S>
S>namespace boost {
S>namespace serialization {

S>struct basic_traits;

S>// default version number is 0. Override with higher version
S>// when class definition changes.
S>template<class T>
S>struct version
S>{
S>     template<class U>
S>     struct traits_class_version {
S>         typedef BOOST_DEDUCED_TYPENAME U::version type;
S>     };

S>     typedef mpl::integral_c_tag tag;
S>     // note: at least one compiler complained w/o the full qualification
S>     // on basic traits below
S>     typedef
S>         BOOST_DEDUCED_TYPENAME mpl::eval_if<
S>             is_base_and_derived<boost::serialization::basic_traits,T>,
S>             traits_class_version<T>,
S>             mpl::int_<0>
         >>::type type;
S>     BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
S>};

S>} // namespace serialization
S>} // namespace boost
S>


S>Означает это, как и написано в комменте, что по дефолту версия равна 0.

S>Т.е., выражение boost::serialization::version<some_type>::value имеет
S>значение 0, если не определена соответствующая специализация. Макрос

S>
S>#define BOOST_CLASS_VERSION(T, N)                                      \
S>namespace boost {                                                      \
S>namespace serialization {                                              \
S>template<>                                                             \
S>struct version<T >                                                     \
S>{                                                                      \
S>     typedef mpl::int_<N> type;                                         \
S>     typedef mpl::integral_c_tag tag;                                   \
S>     BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value); \
S>};                                                                     \
S>}                                                                      \
S>}
S>


S>как раз и определяет такую специализацию. Соответственно, чтобы задать

S>версию для шаблона, можно написать частичную специализацию структуры
S>version — это код который я приводил в прошлый раз.

S>Зачем нужны typedef mpl::int_<N> type; и typedef mpl::integral_c_tag

S>tag; — понятия не имею, предполагаю что низачем.

еще раз спасибо
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.