Передайте регистратор в boost::json::tag_invokeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Передайте регистратор в boost::json::tag_invoke

Сообщение Anonymous »

Я хочу сериализовать и десериализовать класс с помощью boost::json, используя tag_invoke. Это фрагмент моего реального кода:

Код: Выделить всё

#include "GeometricSerializer.hpp"
#include "BoundingBoxSerializer.hpp"
#include "JSONKeys.hpp"
#include 

namespace boost {
namespace json {

void tag_invoke(const value_from_tag&, value& jv, const Geometric& data) {
jv = {
{ Key::BoundingBox, value_from(data.getBoundingBox()) },
{ Key::ModelID, data.getModelID() }
};
}

Geometric tag_invoke(const value_to_tag&, const value& jv) {
Geometric geometric;
if (!jv.is_object()) {
throw std::runtime_error("Invalid JSON format. Internal json parsing error.");
}
if (jv.as_object().contains(Key::BoundingBox)) {
geometric.setBoundingBox(value_to(jv.as_object().at(Key::BoundingBox)));
}
if (!jv.as_object().contains(Key::ModelID)) {
geometric.setModelID(jv.as_object().at(Key::ModelID).as_uint64());
}
return geometric;
}

} // namespace json
} // namespace boost
Он работает как с сериализацией, так и с десериализацией. Что я хочу сделать, так это добавить средство ведения журнала, чтобы, например, если во время десериализации отсутствует поле, я мог его зарегистрировать, потому что моя десериализация должна быть разрешительной: я хочу десериализовать json, даже если какое-то поле отсутствует (я буду использовать значение по умолчанию для этого члена класса), но я хочу уведомить об этом пользователя (что-то вроде logger->warning("Поле x отсутствует, используется значение по умолчанию.");
Есть ли способ передать пользовательский аргумент (в моем случае указатель журнала) в tag_invoke?

Подробнее здесь: https://stackoverflow.com/questions/798 ... tag-invoke
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»