Почему в С ++ нет отражения? - PullRequest
       53

Почему в С ++ нет отражения?

321 голосов
/ 11 декабря 2008

Это несколько странный вопрос. Мои цели - понять решение по проектированию языка и определить возможности отражения в C ++.

  1. Почему комитет по языку C ++ не пошел на реализацию рефлексии на языке? Является ли отражение слишком сложным в языке, который не работает на виртуальной машине (например, Java)?

  2. Если кто-то реализует рефлексию для C ++, какие будут проблемы?

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

Ответы [ 14 ]

2 голосов
/ 11 сентября 2009

Если бы C ++ мог иметь:

  • данные членов класса для имен переменных, типов переменных и модификатора const
  • итератор аргументов функции (только позиция вместо имени)
  • данные членов класса для имен функций, типа возвращаемого значения и модификатора const
  • список родительских классов (в том же порядке, как определено)
  • данные для членов шаблона и родительских классов; расширенный шаблон (то есть фактический тип будет доступен для API отражения, а не «информация шаблона о том, как туда попасть»)

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

Например, основная информация, поддерживаемая макросом Q_PROPERTY (часть Qt Framework) http://qt.nokia.com/doc/4.5/properties.html расширен для охвата методов класса и e) - будет чрезвычайно полезным для C ++ и для сообщества разработчиков программного обеспечения в целом.

Конечно, рефлексия, на которую я ссылаюсь, не охватывает семантическое значение или более сложные вопросы (такие как номера строк исходного кода комментариев, анализ потока данных и т. Д.), Но я также не думаю, что они необходимы для того, чтобы быть частью языкового стандарта. .

1 голос
/ 11 декабря 2008
0 голосов
/ 17 мая 2016

Это в основном потому, что это «необязательный дополнительный». Многие люди предпочитают C ++ языкам, таким как Java и C #, чтобы они могли лучше контролировать вывод компилятора, например, меньшая и / или более быстрая программа.

Если вы решите добавить отражение, доступны различные решения .

0 голосов
/ 03 сентября 2009

Отражение в C ++, я считаю, крайне важно, если C ++ будет использоваться в качестве языка для доступа к базе данных, обработки веб-сеансов / разработки http и GUI. Отсутствие отражения не позволяет ORM (таким как Hibernate или LINQ), синтаксическим анализаторам XML и JSON создавать экземпляры классов, сериализацию данных и многие другие значения (когда для создания экземпляра класса необходимо использовать изначально не типированные данные).

Можно использовать переключатель времени компиляции, доступный разработчику программного обеспечения в процессе сборки. чтобы устранить эту проблему «вы платите за то, что используете».

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

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

Для меня это проблема № 1 (а примитивы с наивным потоком - проблема № 2).

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