Лучший способ понять, почему C++ является способом, которым это, и ценить, это - достижения, должен считать "Дизайн и Эволюцию C++".
Для всех его бородавок, C++ является довольно блин хорошим языком.
Отражение в целом - это средство программы для анализа структуры некоторого кода. Этот анализ используется для изменения эффективного поведения кода.
Отражение, поскольку анализ обычно очень слаб; обычно он может предоставить доступ только к именам функций и полей. Эта слабость проистекает из того, что разработчики языка, по сути, не хотят предоставлять полный исходный код во время выполнения вместе с соответствующими процедурами анализа для извлечения того, что нужно, из исходного кода.
Другой подход - взяться за анализ программы напрямую, используя мощный инструмент анализа программ, например, тот, который может анализировать исходный текст точно так же, как это делает компилятор. (Часто люди предлагают использовать для этого сам компилятор, но обычно это не работает; компилятор хочет быть компилятором, и чертовски сложно приспособить его для других целей).
Что необходимо, так это инструмент, который:
Используя такой механизм, каждый реализует анализ на любом уровне детализации, а затем преобразует код для достижения эффекта, достигаемого отражением во время выполнения. Есть несколько основных преимуществ:
См. наш DMS Software Reengineering Toolkit , чтобы узнать о системе, которая может выполнять все вышеперечисленное для C, Java и COBOL, а также для большинства его для C ++.
[ИЗМЕНИТЬ август 2017 г .: теперь обрабатывает C11 и C ++ 2017]
какие уловки вокруг этого? Есть какие-нибудь советы?
Компилятор, вероятно, при желании сгенерирует «файл символов отладки», который отладчик может использовать для отладки кода. Компоновщик также может сгенерировать «файл карты».
Уловка / совет может заключаться в создании и последующем чтении этих файлов.
На основе по ответам на Как добавить отражение в приложение C ++? (Stack Overflow) и тот факт, что C ++ считается «надмножеством» C, я бы сказал, что вам не повезло.
Также есть хороший длинный ответ о , почему в C ++ нет отражение (переполнение стека) .
Вам нужно будет реализовать это самостоятельно с нуля. В прямом C нет никакой информации о времени выполнения, хранящейся в структурах и составных типах. Метаданные просто не существуют в стандарте.
Мне нужно было отражение в группе struct
s в проекте C ++.
Я создал XML-файл с описанием всех этих структур - к счастью, типы полей были примитивными.
Я использовал шаблон (не шаблон C ++
) для автоматической генерации класса
для каждой struct
вместе с методами установки / получения.
]
В каждом классе
я использовал карту для связывания имен строк и членов класса (указатели на члены).
Я не пожалел об использовании отражения, потому что оно открыло новые способы разработки моих основных функций, которые я даже не мог представить без отражения.
(Кстати, это был внешний генератор отчетов для программы, использующей базу данных raw )
Итак, я использовал генерацию кода, указатели функций и карты для имитации отражения.