@@ -136,14 +136,20 @@ namespace tao::json::binding::internal
136136 }
137137 }
138138
139+ template < typename A, template < typename ... > class Traits , typename C >
140+ [[nodiscard]] static bool require_encode ( const C& x )
141+ {
142+ return ( N == for_nothing_value::encode ) || ( A::kind == member_kind::required ) || ( !A::template is_nothing< Traits >( x ) );
143+ }
144+
139145#if defined( _MSC_VER )
140146#pragma warning( push )
141147#pragma warning( disable : 4127 )
142148#endif
143149 template < typename A, template < typename ... > class Traits , typename C >
144150 static void assign_member ( basic_value< Traits >& v, const C& x )
145151 {
146- if ( ( N == for_nothing_value::encode ) || ( !A:: template is_nothing< Traits >( x ) ) ) {
152+ if ( require_encode< A, Traits >( x ) ) {
147153 v.try_emplace ( A::template key< Traits >(), A::read ( x ) );
148154 }
149155 }
@@ -199,10 +205,7 @@ namespace tao::json::binding::internal
199205 template < template < typename ... > class Traits , typename C >
200206 [[nodiscard]] static std::size_t produce_size ( const C& x )
201207 {
202- if constexpr ( N == for_nothing_value::encode ) {
203- return sizeof ...( As );
204- }
205- return ( std::size_t ( !As::template is_nothing< Traits >( x ) ) + ... );
208+ return ( std::size_t ( require_encode< As, Traits >( x ) ) + ... );
206209 }
207210
208211#if defined( _MSC_VER )
@@ -213,7 +216,7 @@ namespace tao::json::binding::internal
213216 template < typename A, template < typename ... > class Traits , typename Consumer, typename C >
214217 static void produce_member ( Consumer& consumer, const C& x )
215218 {
216- if ( ( N == for_nothing_value::encode ) || ( !A:: template is_nothing< Traits >( x ) ) ) {
219+ if ( require_encode< A, Traits >( x ) ) {
217220 A::template produce_key< Traits >( consumer );
218221 A::template produce< Traits >( consumer, x );
219222 consumer.member ();
0 commit comments