Сообщение Re[35]: The Big OOPs: Anatomy of a Thirty-five-year Mistake от 27.09.2025 10:04
Изменено 27.09.2025 10:08 rg45
Re[35]: The Big OOPs: Anatomy of a Thirty-five-year Mistake
Здравствуйте, Marty, Вы писали:
M>Ну, было бы интересно посмотреть на твоё решение подобной проблемы. Может, ссылку конкретную дашь?
Внешних ссылок нету, но словесное описание дать могу. Эти подходы насчитывают уже почтенную историю и находятся в постоянном развитии.
Сначала была целая эпоха декларативных описаний. Результатом таких декларативных описаний были обычные классы (структуры) C++, сопровождаемые метаданными — возможности доступа к полям структур по именам и по индексам. Зачастую в метаданные включались средства форматного контроля и версионирования. Поверх таких структур можно было делать унифицированные обработки типа ввода-вывода, сериализации и пр. Пример такого декларативноного описания вот:
Очевидным недостатком этого подхода является использование макросов, от которых хотелось бы избавиться вовсе.
Сейчас вся эта кухня движется в сторону "чистых" структур без макросов с использованием компайл-тайм рефлексии. Эти подходы частично перекликаются с теми, которые используются в boost::mpl.
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++, сопровождаемые метаданными — возможности доступа к полям структур по индексам и по строковым представлениям имён. Зачастую в метаданные включались средства форматного контроля и версионирования. Поверх таких структур можно было делать унифицированные обработки типа ввода-вывода, сериализации и пр. Пример такого декларативноного описания вот:
Очевидным недостатком этого подхода является использование макросов, от которых хотелось бы избавиться вовсе.
Сейчас вся эта кухня движется в сторону "чистых" структур без макросов с использованием компайл-тайм рефлексии. Эти подходы частично перекликаются с теми, которые используются в boost::mpl.
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.