Библиотеки атрибутов и отражений для С++?

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

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

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

Ответы

Ответ 1

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

XRTTI:

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

OpenС++:

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

Ответ 2

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

C++ meets Reflection

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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 << " ";
     }
}

Ответ 5

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

Другими перспективными решениями, которые я рассмотрел, являются

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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