Übergeben Sie einen Logger an boost::json::tag_invokeC++

Programme in C++. Entwicklerforum
Anonymous
 Übergeben Sie einen Logger an boost::json::tag_invoke

Post by Anonymous »

Ich möchte eine Klasse mit boost::json mithilfe von tag_invoke serialisieren und deserialisieren. Dies ist ein Ausschnitt meines tatsächlichen Codes:

Code: Select all

#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
Es funktioniert sowohl mit Serialisierung als auch mit Deserialisierung. Was ich tun möchte, ist, einen Logger hinzuzufügen, damit ich es beispielsweise protokollieren kann, wenn während der Deserialisierung ein Feld fehlt, da meine Deserialisierung zulässig sein muss: Ich möchte einen JSON deserialisieren, auch wenn ein Feld fehlt (ich verwende den Standardwert für dieses Klassenmitglied), aber ich möchte dies dem Benutzer mitteilen (so etwas wie logger->warning("Feld x fehlt, Standardwert wird verwendet.");
Gibt es eine Möglichkeit, ein benutzerdefiniertes Argument (in meinem Fall den Logger-Zeiger) an tag_invoke zu übergeben?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post