Comments 12
Обозвать RTTI рефлексией это мощно, молодёжно, современно.
Еще есть библиотека, которая RTTR позволяет регистрировать и манипулировать свойствами и методами классов во время выполнения.
Читать так: Есть сторонняя библиотека RTTR (https://github.com/rttrorg/rttr), которая регистрирует свойства, методы и классы, после чего ими можно манипулировать. Что не было зарегистрировано, тем манипулировать нельзя. Что в целом не похоже на рефлексию в той же Java.
Qt же
Да, но тоже с ограничениями
классы являются наследниками QObject
проперти, слоты и сигналы объявлены через ключевые слова или макросы
обычные методы недоступны в рантайм по имени
Так что это также не сильно похоже на рефлексию в Java, где можно найти любой метод или поле любого класса.
Читать так: Есть сторонняя библиотека RTTR (https://github.com/rttrorg/rttr), которая регистрирует свойства, методы и классы, после чего ими можно манипулировать.
Я вот на это отвечал )
Статья морально устарела и плохо переведена. Обе библиотеки предполагают ручную регистрацию на макросах, что выглядит не очень, можно забыть что-то зарегистрировать и так далее.
Есть ли в c++ рефлексия? Пока - нет. Есть ли реализованная интроспекция для всех типов - нет. Но есть интроспекция для агрегатов, реализованная в boost.pfr. Лучше рассказать о ней, а не о двух морально устаревших библиотеках.
Ну в зачаточном состоянии уже есть. И доступна через одно место. Но хоть что-то
#include <rfl/json.hpp>
#include <rfl.hpp>
struct Person {
std::string first_name;
std::string last_name;
int age;
};
const auto homer =
Person{.first_name = "Homer",
.last_name = "Simpson",
.age = 45};
// We can now write into and read from a JSON string.
const std::string json_string = rfl::json::write(homer);
auto homer2 = rfl::json::read<Person>(json_string).value();
Выглядит как магия. Макросов в определении struct Person не видно. Как это работает?
Есть третий тип рефлексии, когда код формируется во время выполнения. И вот этот тип в C++ реализуется только вручную или используя библиотеку интерпретатора другого языка (например, Python), или компиляцией в процессе выполнения (так работает plrust в PostgreSQL)
Спасибо за статью, использую Unreal Engine, где используется рефлексия, но не знал, каким путем она достигается
По рефлексии в анриале есть статья
https://habr.com/ru/articles/690662/
Не понимаю, почему постоянно идут разговоры про тупую рефлексию (а на деле даже не про рефлексию, а про интроспекцию, т.к. рефлексия позволяет кодогенерациию в рантайие). Рефлексия и интроспекцич позволяет работать только со стандартными языковыми конструкциями. Для реальных задач этого недостаточно. Нужна возможность описать и исследовать структуру данных в форме, специфичной для задачи. Обычно это означает, что нужно описать не только тип и список его членов, но и некоторые дополнительные атрибуты этих членов, и, возможно, типов. Например, для задачи сериализации нужна возможность описать полиморфные типы, как-то их перечислить, и указать, в какое поле записывать имя полиморфного типа. Для сериализации в xml нужно различать атрибуты и теги, для сериализации массивов зачастую нужно указывать разные теги для самого массива и элементов массива. Для бинарной сериализации иногда нужно явно указывать порядок байт для конкретного члена, хотя обычно это можно сделать за счёт выбора нужного сериализатора.
В то же время самому языку программирования эти атрибуты не нужны, поэтому для описания атрибутов нужна какая-то кодогенерация, в виде макросов или ещё чего-то. В случае c++ полноценным решение будут метоклассы, но и без них можно реализовать более полезные способы описания структур, чем указаны в статье.
Два типа рефлексий в C++