diff --git a/art/json/marshaling.hxx b/art/json/marshaling.hxx index 1f084ed..62a06b8 100644 --- a/art/json/marshaling.hxx +++ b/art/json/marshaling.hxx @@ -26,6 +26,21 @@ namespace art::json { + struct access + { + template + using json = T::json; + + template + static + T + create() + { + return T{}; + } + + }; + class marshaling_context_t { protected: @@ -208,7 +223,7 @@ namespace art::json T unmarshal(variant const& v, marshaling_context_t* context) { - T instance; + auto instance = access::create(); do_unmarshal(instance, v, context); return instance; } @@ -222,7 +237,7 @@ namespace art::json void do_marshal(variant& v, T const& instance, marshaling_context_t* context) { - ((Bases::json::do_marshal(v, instance, context)), ...); + ((access::json::do_marshal(v, instance, context)), ...); First::marshal(v, instance, context); ((Members::marshal(v, instance, context)), ...); } @@ -240,7 +255,7 @@ namespace art::json void do_unmarshal(T& instance, variant const& v, marshaling_context_t* context) { - ((Bases::json::do_unmarshal(instance, v, context)), ...); + ((access::json::do_unmarshal(instance, v, context)), ...); First::unmarshal(instance, v, context); ((Members::unmarshal(instance, v, context)), ...); @@ -253,7 +268,7 @@ namespace art::json T unmarshal(variant const& v, marshaling_context_t* context) { - T instance; + auto instance = access::create(); do_unmarshal(instance, v, context); return instance; } @@ -309,14 +324,14 @@ namespace art::json variant marshal(T const& instance, marshaling_context_t* context) { - return T::json::marshal(instance, context); + return access::json::marshal(instance, context); } static T unmarshal(variant const& v, marshaling_context_t* context) { - return T::json::unmarshal(v, context); + return access::json::unmarshal(v, context); } };