Информация об изменениях

Сообщение Re[35]: The Big OOPs: Anatomy of a Thirty-five-year Mistake от 27.09.2025 10:04

Изменено 27.09.2025 10:07 rg45

Re[35]: The Big OOPs: Anatomy of a Thirty-five-year Mistake
Здравствуйте, Marty, Вы писали:

M>Ну, было бы интересно посмотреть на твоё решение подобной проблемы. Может, ссылку конкретную дашь?


Внешних ссылок нету, но словесное описание дать могу. Эти подходы насчитывают уже почтенную историю и находят в постоянном развитии.

Сначала была целая эпоха декларативных описаний. Результатом таких декларативных описаний были обычные классы (структуры) C++, сопровождаемые метаданными — возможности доступа к полям структур по именам и по индексам. Зачастую в метаданные включались средства форматного контроля и версионирования. Поверх таких структур можно было делать унифицированные обработки типа ввода-вывода, сериализации и пр. Пример такого декларативноного описания вот:

   STRUCT_BEGIN(Expiration)
      KEY((contractYear, contractMonth), (std::optional<int>, std::optional<int>))
      FIELD(contractYear,        std::optional<int>, Pattern("\\d{1,2}"))
      FIELD(contractMonth,       std::optional<int>, Pattern("\\d{1,2}"))
      FIELD(expirationDate,      boost::gregorian::date, Expanded)
      FIELD(daysToExpiry,        int)
      FIELD(xmMaturityBucketID,  std::optional<int>)
      FIELD(teaBucketID,         std::optional<TeaBucketID>, VERSION(80))
      FIELD(contractDate,        boost::gregorian::date, ExtendedISO DEFAULT(_.expirationDate) VERSION(111))
      SECTION("S", series, SeriesMap)
   STRUCT_END(Expiration)


Очевидным недостатком этого подхода является использование макровосов, от которых хотелось бы избавиться вовсе.

Сейчас вся эта кухня движется в сторону "чистых" структур без макросов с использованием компайл-тайм рефлексии. Эти подходы частично перекликаются с теми, которые используются в boost::mpl.
Re[35]: The Big OOPs: Anatomy of a Thirty-five-year Mistake
Здравствуйте, Marty, Вы писали:

M>Ну, было бы интересно посмотреть на твоё решение подобной проблемы. Может, ссылку конкретную дашь?


Внешних ссылок нету, но словесное описание дать могу. Эти подходы насчитывают уже почтенную историю и находят в постоянном развитии.

Сначала была целая эпоха декларативных описаний. Результатом таких декларативных описаний были обычные классы (структуры) C++, сопровождаемые метаданными — возможности доступа к полям структур по именам и по индексам. Зачастую в метаданные включались средства форматного контроля и версионирования. Поверх таких структур можно было делать унифицированные обработки типа ввода-вывода, сериализации и пр. Пример такого декларативноного описания вот:

   STRUCT_BEGIN(Expiration)
      KEY((contractYear, contractMonth), (std::optional<int>, std::optional<int>))
      FIELD(contractYear,        std::optional<int>, Pattern("\\d{1,2}"))
      FIELD(contractMonth,       std::optional<int>, Pattern("\\d{1,2}"))
      FIELD(expirationDate,      boost::gregorian::date, Expanded)
      FIELD(daysToExpiry,        int)
      FIELD(xmMaturityBucketID,  std::optional<int>)
      FIELD(teaBucketID,         std::optional<TeaBucketID>, VERSION(80))
      FIELD(contractDate,        boost::gregorian::date, ExtendedISO DEFAULT(_.expirationDate) VERSION(111))
      SECTION("S", series, SeriesMap)
   STRUCT_END(Expiration)


Очевидным недостатком этого подхода является использование макросов, от которых хотелось бы избавиться вовсе.

Сейчас вся эта кухня движется в сторону "чистых" структур без макросов с использованием компайл-тайм рефлексии. Эти подходы частично перекликаются с теми, которые используются в boost::mpl.