LINUX.ORG.RU

[c++] reflection

 


0

0

подскажите в такой ситуации: в классе есть набор разнотипных полей, которые:

1. нужно сериализовать и десериализовать
2. к ним нужно обращаться из других классов для чтения/записи
3. очень хочется функцию сер./десер. протянуть через наследование

в крайнем случае можно все засунуть в map, но из-за разнотипности будут тяжелые проблемы.

В С++ нет reflection-а. Можно Qt посмотреть, MOC вроде бы добавляет её в каком-то виде.

Обычно делают макрос, вроде DECLARE_FIELD, который помимо объявления поля регистрирует его где надо, и все нужные поля объявляют с его помощью.

Кстати, для (де)сериализации в бусте есть что то.

Legioner ★★★★★
()

>подскажите в такой ситуации: в классе есть набор разнотипных полей, которые:

Сериализация тривиальна - оверрайдишь виртуальную функцию serialize(some_ptr<SomeOutputStream> os), где в первую очередь пишешь идентификатор типа, во вторую вызываешь функцию serialize() родителя, а в третью - пишешь все поля последовательно, для внутренних полей вызываешь сериализацию рекурсивно.

Десериализация через фабрику - по идентификатору типа инстанциируешь объект, вызываешь ему метод deserialize(some_ptr<SomeInputStream> is), читаешь данные в том же порядке.

Конечно же, в быдло-С++ уже есть зоопарк таких фреймворков, так что удачи.

Absurd ★★★
()
Ответ на: комментарий от anonymous

> а вот и жабисты подтянулись.

мимо

eXOR ★★★★★
()
Ответ на: комментарий от Absurd

>Сериализация тривиальна - оверрайдишь виртуальную функцию serialize(some_ptr<SomeOutputStream> os), где в первую очередь пишешь идентификатор типа, во вторую вызываешь функцию serialize() родителя

это ч0, надо для каждого класса "сериализацию" ручками писать? нафиг-нафиг. Проще сделать MOP в C++ и действовать через него.

anonymous
()
Ответ на: комментарий от eXOR

> ентерпрайз лучше на c++ не писать.

давно хотел спросить - что такое этот "ентерпрайз", о котором все любят говорить?

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.