C ++ и сериализация: есть ли способ сделать какой-то самоанализ? - PullRequest
3 голосов
/ 15 ноября 2011

Я читал некоторые примеры в Википедии , но я ищу несколько реальных примеров: как используется интроспекция, почему (это помогает писать чистый код) и сам код.

Например, есть ли способ создать «универсальную» функцию для сериализации любого типа объекта? Я имею в виду: только одна функция в родительской, и все потомки могут «сохранять» + «восстанавливать» себя в / из файла.

Ответы [ 7 ]

1 голос
/ 15 ноября 2011

Он не используется (так как он не существует), нет примеров кода (поскольку он не существует), и нет никаких оснований пытаться использовать его (так как он не существует).

Самое близкое, что вы можете получить - RTTI / dynamic_cast.Но на самом деле это не самоанализ.

1 голос
/ 15 ноября 2011

В C ++ есть RTTI, и вы также можете использовать условные обозначения и dynamic_cast<>() для этого, но в C ++ мы обычно стремимся сделать как можно больше во время компиляции.Если вы чувствуете необходимость в интроспекции, есть лучшие способы достичь того, к чему вы стремитесь, с помощью статического подхода.

0 голосов
/ 15 ноября 2011

Как уже говорили другие, интроспекция - это не особенность C ++, и ближе всего к ней можно прийти, это typeid () и dynamic_cast <>, но вам не очень хочется приближаться к ней.;)

Тщательное проектирование системы владения, передача и удержание ссылок, использование основанного на политике дизайна может использоваться, чтобы избавиться от этой потребности в самоанализе: в строго ООП мире объекты не 't (должно быть) требуется знать свой собственный тип (помимо обеспечения virtual поведения, где это определено).

0 голосов
/ 15 ноября 2011

Из связанной статьи видно, что вы имеете в виду typeid и dynamic_cast<>. Вы должны четко указать это в вопросе, так как вскоре вы увидите, что многие люди прыгают прямо, не просматривая ссылки.

Теперь, как / когда они используются? Самый простой ответ - это, как правило, не должно использоваться. В большинстве случаев хорошо разработанная программа не нуждается в проверке типов во время выполнения, и если вы обнаружите, что делаете это, то есть вероятность, что у вашего проекта проблемы.

Конечно, есть исключения во всех вещах, и, в частности, пример, который @Sga дал, действительно хороший. В boost::any библиотека выполняет стирание типа , чтобы иметь возможность хранить любой объект внутри типа, а затем использует RTTI вручную в any_cast при извлечении значения, чтобы проверить, что тип фактического объекта правильный. Теперь, это также не распространено, большинство программ не используют стирание типов , и когда они делают, очень мало раз им нужно анализировать тип во время выполнения.

0 голосов
/ 15 ноября 2011
0 голосов
/ 15 ноября 2011

Я предлагаю вам взглянуть на boost :: any

http://www.boost.org/doc/libs/1_47_0/doc/html/any.html

0 голосов
/ 15 ноября 2011

Не совсем.Самый близкий у вас будет RTTI .Но посмотрите на метаобъекты Qt , чтобы увидеть, как они это сделали (также используя их генератор moc).

...