@@ -32,6 +32,20 @@ try_value_to( const value& jv );
3232}
3333// end::doc_forward_conversion_1[]
3434
35+ // tag::doc_forward_conversion_4[]
36+ namespace boost {
37+ namespace json {
38+
39+ template < class T >
40+ struct has_value_from ;
41+
42+ template < class T >
43+ struct has_value_to ;
44+
45+ }
46+ }
47+ // end::doc_forward_conversion_4[]
48+
3549// tag::doc_forward_conversion_3[]
3650namespace boost {
3751namespace json {
@@ -156,6 +170,35 @@ tag_invoke(
156170}
157171// end::doc_forward_conversion_3[]
158172
173+ // tag::doc_forward_conversion_4[]
174+
175+ namespace third_party
176+ {
177+
178+ struct json_storage
179+ {
180+ boost::json::value& jv;
181+
182+ template < class T >
183+ friend
184+ typename std::enable_if< boost::json::has_value_from<T>::value >::type
185+ process (json_storage& s, T const & t)
186+ {
187+ boost::json::value_from (t, s.jv );
188+ }
189+
190+ template < class T >
191+ friend
192+ typename std::enable_if< ! boost::json::has_value_from<T>::value >::type
193+ process (json_storage& s, T const &)
194+ {
195+ boost::json::value_from (" unknown value" , s.jv );
196+ }
197+ };
198+
199+ }
200+ // end::doc_forward_conversion_4[]
201+
159202#include < boost/json/value_from.hpp>
160203#include < boost/json/value_to.hpp>
161204
@@ -193,6 +236,16 @@ class doc_forward_conversion
193236 BOOST_TEST ( get<1 >(addr2) == 115 );
194237 BOOST_TEST ( get<2 >(addr2) == 81 );
195238 BOOST_TEST ( get<3 >(addr2) == 22 );
239+
240+ jv.emplace_null ();
241+ third_party::json_storage s{jv};
242+ process (s, addr2);
243+ BOOST_TEST (( jv == value{ 212 , 115 , 81 , 22 } ));
244+
245+ struct some_struct {};
246+ jv.emplace_null ();
247+ process (s, some_struct{});
248+ BOOST_TEST (( jv == value{ " unknown value" } ));
196249 }
197250};
198251
0 commit comments