Отражение объекта - PullRequest
       13

Отражение объекта

2 голосов
/ 09 октября 2009

Есть ли у кого-нибудь ссылки для построения полной системы отражения объектов / классов в C ++?

Я видел несколько сумасшедших решений для макросов / шаблонов, однако никогда не находил систему, которая бы решала все до уровня, который мне удобен.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 09 октября 2009

Использование шаблонов и макросов для автоматического или полуавтоматического определения всего - почти единственная опция в C ++. C ++ имеет очень слабые способности к размышлению / самоанализу Однако, если вы хотите в основном сериализовать и хранить, это уже реализовано в библиотеках Boost Serialization . Вы можете сделать это, реализовав метод сериализатора в классе, или иметь внешнюю функцию , если вы не хотите изменять класс.

Похоже, это не то, что вы спрашивали. Я предполагаю, что вы хотите что-то вроде автоматической сериализации, которая не требует дополнительных усилий со стороны реализации класса. Они есть в Python и Java и во многих других языках, но не в C ++. Чтобы получить то, что вы хотите, вам нужно реализовать собственную объектную систему, например, мета-объектную систему, о которой Игх упоминал в своем ответе .

Если вы хотите это сделать, я бы посоветовал посмотреть, как JavaScript реализует объекты. JavaScript использует основанную на прототипах объектную систему , которая является достаточно простой, но достаточно мощной. Я рекомендую это, потому что мне кажется, что это было бы легче реализовать, если бы вам пришлось делать это самостоятельно. Если вы хотите прочитать ОЧЕНЬ многословное объяснение преимуществ и элегантности прототипов, вы можете найти эссе на эту тему в блоге Стива Йегге. Он очень опытный программист, поэтому я доверяю его мнению, но сам никогда этим не занимался, поэтому могу лишь указать на то, что сказали другие.

Если вы хотите остаться с более стилевым классом и экземплярами C ++ вместо менее знакомых прототипов, посмотрите, как работают Python объекты и сериализация . Python также использует подход «свойств» для реализации своих объектов, но свойства используются для реализации классов и наследования вместо системы, основанной на прототипах, поэтому он может быть немного более знакомым.

Извините, что у меня нет более простого ответа на ваш вопрос! Но, надеюсь, это поможет.

2 голосов
/ 09 октября 2009

Я не совсем уверен, что понял ваше намерение, однако инфраструктура Qt содержит мощную систему мета-объектов , которая позволяет вам выполнять большинство операций, ожидаемых от отражения системы: получение имени класса в виде строки проверка, является ли объект экземпляром данного типа, перечисление и вызов методов и т. д.

1 голос
/ 06 ноября 2009

Я использовал ROOT's Reflex библиотека с хорошими результатами. Вместо того, чтобы использовать сумасшедшие решения для макросов / шаблонов, как вы описали, он обрабатывает ваши заголовочные файлы C ++ во время сборки, чтобы создать словари отражений, а затем работает из них.

...