Библиотеки атрибутов и отражений для С++?
Большинство зрелых проектов на 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