Подтвердить что ты не робот

Библиотека отражений С++ 11

В настоящее время я собираюсь написать большой проект в С++ 11.

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

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

Или, может быть, С++ 11 предоставил некоторые дополнительные функции, которые помогут улучшить дизайн библиотек отражения, и я должен написать его сам? (Я не нашел информации об этом, хотя.)

4b9b3361

Ответ 1

С++ - не лучший язык для размышлений. С++ 0x на самом деле не меняет этого. Вы можете получить ограниченную поддержку для статического отражения с использованием признаков типа, и вы даже можете использовать SFINAE для статического определения того, имеет ли определенный класс определенную функцию-член или переменную-член. Но это действительно так.

Динамическое отражение сильно ограничено. Вы можете получить тип класса во время выполнения с помощью средств <typeinfo>, но об этом.

Что касается статического отражения, то возможность универсальной итерации по классу и получения каждой переменной-функции/функции просто невозможна без серьезных компромиссов. Boost.Fusion справляется с этим, предоставляя макросы, которые позволяют привязывать объект к контейнеру, подобному кортежу. На самом деле класс std::tuple или boost::tuple естественно обеспечивает отражение во время компиляции - другими словами, вы можете статически перебирать кортеж и определять тип каждого члена. Это дает вам что-то, приближающее отражение во время компиляции по произвольным агрегатным типам. К сожалению, это не так удобно, как если бы была встроена встроенная поддержка отражения для произвольных классов.

Ответ 2

Кажется, что есть библиотека, которая удовлетворяет вашим "широким" требованиям. Посмотрите на Зеркало: Boost.Mirror. Обратите внимание, что он официально НЕ является частью повышения. Вы также можете взглянуть на другие библиотеки: Отражающее программирование.

Ответ 3

QT имеет примитивную форму отражения, вы, вероятно, хотите взять на себя добычу.

Ответ 4

Ну, в зависимости от того, что вам нужно, вы можете создать свой собственный ontop python и clang python bindings. Есть несколько примеров, например, мой собственный https://github.com/nevion/metapod - другие существуют, если вы убираете достаточно сильно и в некотором смысле это что делает инструмент Qt MOC - кроме clang делает задачу намного проще. Одна из самых интересных вещей в этом подходе заключается в том, что он работает для всех компиляторов, потому что вы просто генерируете стандартизованный код с шаблонами mako, но это также означает, что он не полностью автоматичен - так что есть компромисс, и он не будет иметь дело с каждым метапрограммированием/отражающий требуется. Как сказал Чарльз Сальвия, С++ - не лучший язык для размышлений, поэтому вам нужно взять то, что вы можете получить.