Библиотеки атрибутов и отражений для C ++? - PullRequest
15 голосов
/ 18 сентября 2008

Большинство зрелых проектов C ++, похоже, имеют собственную систему отражения и атрибутов , т.е. для определения атрибутов, к которым можно получить доступ через строку и которые автоматически сериализуются. По крайней мере, многие проекты на C ++, в которых я принимал участие, казались изобретением колеса .

Знаете ли вы какие-нибудь хорошие библиотеки с открытым исходным кодом для C ++, которые поддерживают контейнеры отражений и атрибутов, в частности:

  • Определение RTTI и атрибутов с помощью макросов
  • Доступ к RTTI и атрибутам через код
  • Автоматическая сериализация атрибутов
  • Прослушивание изменений атрибутов (например, OnValueChanged)

Ответы [ 8 ]

11 голосов
/ 16 июня 2010

Существует новый проект, обеспечивающий отражение в C ++ с использованием совершенно другого подхода: CAMP . https://github.com/tegesoft/camp

CAMP не использует прекомпилятор, классы / свойства / функции / ... объявляются вручную с использованием синтаксиса, похожего на boost.python или luabind. Конечно, люди могут использовать прекомпилятор, такой как gccxml или open-c ++, чтобы сгенерировать это объявление, если они предпочитают.

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

Распространяется по лицензии MIT (ранее LGPL).

11 голосов
/ 18 сентября 2008

Это то, что вы получаете, когда C ++ встречает Reflection:

C++ meets Reflection

Что бы вы ни выбрали, у него, вероятно, будут ужасные макросы, сложный для отладки кода или странные шаги сборки. Я видел, как одна система автоматически генерировала код сериализации из файла PDB DevStudio.

Если серьезно, для небольших проектов будет проще писать функции сохранения / загрузки (или использовать потоковые операторы). На самом деле, это может относиться и к большим проектам - очевидно, что происходит, и вам, как правило, придется изменить код в любом случае, если структура изменится.

5 голосов
/ 18 сентября 2008

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

XRTTI

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

OpenC ++

OpenC ++ - это библиотека внешнего интерфейса C ++ (лексер + синтаксический анализатор + DOM / MOP) и транслятор исходного кода. OpenC ++ позволяет разрабатывать инструменты языка C ++, расширения, оптимизации для конкретного предметного компилятора и протоколы метаобъектов во время выполнения.

4 голосов
/ 21 марта 2010

Я смотрел на эти вещи довольно долго, но они, как правило, очень жесткие. Они могут помешать вам использовать наследование или иметь странные конструкторы и т. Д. И т. Д. В конце концов они оказались слишком обременительными, а не удобными.

Этот подход для демонстрации членов, который я сейчас использую, довольно легкий и позволяет вам исследовать класс для сериализации или установки, например, всех полей с именем "x" в 0. Это также статически определено, поэтому очень, очень быстро. Нет слоев библиотечного кода или кода поколения, чтобы беспокоиться о путанице с процессом сборки. Обобщает иерархии вложенных типов.

Установите в вашем редакторе несколько макросов, чтобы автоматизировать написание некоторых из этих вещей.

struct point
{
     int x;
     int y;

     // add this to your classes
     template <typename Visitor>
     void visit(Visitor v)
     {
         v->visit(x, "x"); 
         v->visit(y, "y");
     }
};


/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
     template <typename T>
     void visit(const T& rhs)
     {
         rhs.visit(this);
     }

     template <typename Scalar>
     void visit (const Scalar& s, const char* name)
     {
          std::cout << name << " = " << s << " ";
     }
}
3 голосов
/ 06 сентября 2012

Посмотрел на это тоже немного. Текущее простейшее решение кажется BOOST_FUSION_ADAPT_STRUCT . Практически, когда у вас есть библиотека / заголовок, вам нужно всего лишь добавить свои поля структуры в макрос BOOST_FUSION_ADAPT_STRUCT (), так как последний сегмент кода показывает . Да, у него есть ограничения, о которых упоминали многие другие. И это не поддерживает слушателей напрямую.

Другие многообещающие решения, на которые я смотрел:

  • CAMP и XRTTI / gccxml, однако, оба препятствия привносят зависимость от внешних инструментов в ваш проект.
  • Несколько лет назад я использовал perl c2ph / pstruct, чтобы получить мета-информацию из вывода gcc -gstabs, который менее навязчив, но требует больше работы, хотя работал отлично для меня.

Что касается подхода boost / __ cxa, как только вы выясните все мелкие детали, добавление / изменение структур или полей становится простым в обслуживании. в настоящее время мы используем его для создания слоя связывания пользовательских типов поверх dbus, для сериализации API и скрытия деталей транспорта / RPC для подсистемы обслуживания управляемых объектов.

2 голосов
/ 18 сентября 2008

Это печально известная слабость языка C ++ в целом, потому что вещи, которые необходимо стандартизировать, чтобы сделать реализации отражений переносимыми и полезными, не являются стандартными. Вспоминаются соглашения о вызовах, расположение объектов и искажение символов, но есть и другие.

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

2 голосов
/ 18 сентября 2008

Не общий, но QT поддерживает это через мета-компилятор и является GPL. Я понял из общения с людьми из QT, что это невозможно с чистым C ++, поэтому мне нужен moc.

0 голосов
/ 12 марта 2014

Автоматический инструментарий самоанализа / отражения. Используйте мета-компилятор, такой как Qt, и добавляйте мета-информацию непосредственно в объектные файлы Интуитивно понятный, простой в использовании. Нет внешних зависимостей. Даже позволяют автоматически отражать std :: string и затем использовать его в скриптах. Пожалуйста, посетите ИДК

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...