Библиотека отражения С++ 11 [закрыта]

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

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

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

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


person Wojciech Danilo    schedule 20.11.2010    source источник
comment
Похоже, ваш дизайн не соответствует выбранному вами языку.   -  person Yakov Galka    schedule 20.11.2010
comment
Это [похожий вопрос]( stackoverflow.com/questions/41453/). Я также искал и нашел CAMP. У меня есть fork, который удаляет зависимость от Boost и вместо этого использует C++11.   -  person Nick    schedule 05.12.2015
comment
Я не уверен, насколько это изменилось за прошедшие годы, но вы можете реализовать некоторые функции отражения посредством тщательного проектирования. Например: шаблон декоратора для добавления/изменения поведения в CT или RT (en.wikipedia.org/wiki/ Decorator_pattern); SFINAE для обнаружения функции в CT stackoverflow.com/a/29319078/1043529; отд. инверсия (en.wikipedia.org/wiki/Dependency_inversion_principle) для поиска конкретных методов (CRTP и static_cast для CT, dynamic_cast для RT) и многое другое. Полное отражение для действительно произвольных типов? Выбирайте свои битвы, это в гору.   -  person John P    schedule 01.12.2017


Ответы (4)


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

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

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

person Charles Salvia    schedule 20.11.2010

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

person AraK    schedule 20.11.2010
comment
Благодарю вас! Это действительно интересно, я посмотрю на него поближе :) - person Wojciech Danilo; 20.11.2010
comment
+1 выглядит действительно хорошо - с несколькими небольшими изменениями, похоже, он работает с gcc 4.7.2. - person kfmfe04; 17.12.2012

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

person Edison Gustavo Muenz    schedule 20.11.2010
comment
Хорошо сделаю :) Почему примитивно? - person Wojciech Danilo; 20.11.2010
comment
Ну, это далеко от гибкости других языков, таких как java и C#. Он также работает только с классами, унаследованными от QObject. Я не знаю о других ограничениях. - person Edison Gustavo Muenz; 21.11.2010

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

person Jason Newton    schedule 19.04.2015