Можно ли привести структуры C ++ к структурам Microsoft Bond?

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

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

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …