Как стать автором
Обновить

Комментарии 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, где используется рефлексия, но не знал, каким путем она достигается

Не понимаю, почему постоянно идут разговоры про тупую рефлексию (а на деле даже не про рефлексию, а про интроспекцию, т.к. рефлексия позволяет кодогенерациию в рантайие). Рефлексия и интроспекцич позволяет работать только со стандартными языковыми конструкциями. Для реальных задач этого недостаточно. Нужна возможность описать и исследовать структуру данных в форме, специфичной для задачи. Обычно это означает, что нужно описать не только тип и список его членов, но и некоторые дополнительные атрибуты этих членов, и, возможно, типов. Например, для задачи сериализации нужна возможность описать полиморфные типы, как-то их перечислить, и указать, в какое поле записывать имя полиморфного типа. Для сериализации в xml нужно различать атрибуты и теги, для сериализации массивов зачастую нужно указывать разные теги для самого массива и элементов массива. Для бинарной сериализации иногда нужно явно указывать порядок байт для конкретного члена, хотя обычно это можно сделать за счёт выбора нужного сериализатора.

В то же время самому языку программирования эти атрибуты не нужны, поэтому для описания атрибутов нужна какая-то кодогенерация, в виде макросов или ещё чего-то. В случае c++ полноценным решение будут метоклассы, но и без них можно реализовать более полезные способы описания структур, чем указаны в статье.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий