Можно ли привести структуры C ++ к структурам Microsoft Bond? - PullRequest
0 голосов
/ 13 октября 2018

Цель состоит в том, чтобы преобразовать структуру C ++, предоставленную в структуру связи.Поддерживается ли это Бондом?

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

1 Ответ

0 голосов
/ 16 октября 2018

Если вы можете предоставить специализацию для bond::schema<T> для структуры, не связанной с Bond, это даст достаточно метаданных во время компиляции о структуре, не связанной с Bond, так что многие из API Bond могут быть вызваныв не-сгенерированной Bond структуре, как transforms API.Например, сериализация std::tuple<T...> реализуется с помощью специализации bond::schema<std::tuple<T...>>.

C ++ - пока - не имеет отражения во время компиляции для структур.Существуют различные способы симуляции этого (например, Boost :: Fusion , схемы на основе макросов, инструменты генерации кода).Большая часть генерации кода B ++ для C ++ добавляет схему времени компиляции , которую позже использует библиотека.

Если структура C ++ и структура C ++, созданная Bond, имеют совместимую компоновку и оба Тривиально копируемое , вы можете использовать std::memcpy для «приведения путем копирования» к структуре, сгенерированной Bond, а затем манипулировать структурой Bond по мере необходимости.Я бы обернул такое поведение во вспомогательный метод щедрыми static_assert проверками, чтобы избежать неопределенного поведения по мере развития структур.Это будет работать только с очень ограниченными структурными формами: например, поля коллекции, скорее всего, сделают структуру нетривиально копируемой.Вам нужно использовать Bond версии 8.x или новее и последнюю версию вашего компилятора C ++ для сгенерированных структур Bond, чтобы вообще иметь возможность простого копирования.(См. Commit fa02289f , который удалил много ctor, отличных от заданных по умолчанию.)

...