Я заметил, что рефлексия - это одна из особенностей, которую разработчики из других языков испытывают недостаток в c ++. Для некоторых приложений я действительно понимаю, почему! Намного проще написать такие вещи, как автозаполнение IDE, если у вас есть отражение. И, конечно же, API-интерфейс сериализации стал бы проще, если бы он у нас был.
С другой стороны, один из основных принципов c ++ - не платить за то, что вы не используете. Что имеет полный смысл. Это то, что я люблю в C ++.
Но мне пришло в голову, что может быть компромисс. Почему компиляторы не добавляют расширения в структуру std::type_info
? Не было бы времени выполнения. Двоичный файл может оказаться больше, но это может быть простой переключатель компилятора для включения / выключения, и, честно говоря, если вы действительно беспокоитесь о экономии места, вы, скорее всего, отключите исключения и RTTI.
Некоторые люди ссылаются на проблемы с шаблонами, но компилятор успешно генерирует std::type_info
структур для типов шаблонов.
Я могу представить себе переключатель g ++, такой как -fenable-typeinfo-reflection
, который мог бы стать очень популярным (и такие распространенные библиотеки, как boost / Qt / etc, могли бы легко иметь проверку для генерации кода, который использует его, если таковой имеется, и в этом случае конечный пользователь выиграет не дороже, чем щелкнуть выключателем). Я не считаю это необоснованным, поскольку такие большие переносимые библиотеки уже зависят от расширений компилятора.
Так почему же это не распространено? Я полагаю, что я что-то упустил, какие технические проблемы с этим?
РЕДАКТИРОВАТЬ: Всего несколько метрик перебазировать аргумент:
Я посмотрел на довольно большой проект Qt (около 45 000 LoC) и измеряет размер метаобъектов. Я считаю, что это разумный показатель, потому что система Qt moc является довольно исчерпывающей системой отражений (типы, функции, перечисления, члены и некоторые конкретные понятия Qt, такие как «свойства»). Всего было 67 метаобъектов , так что нет ничего сложного, но ничего сумасшедшего, , что в сумме составляет 5479 байт Однако почти все они были 32-байтовыми или менее (, самый большой из которых составлял 1427 байт ). Учитывая, что современные компиляторы производят двоичные файлы размером более 4 КБ даже для самой простой программы, эти цифры не возмутительны). Хотя я бы хотел, чтобы что-то подобное было применено к STL
, чтобы увидеть, как оно выглядит справедливо.