@@ -92,6 +92,9 @@ class basic_json : private json_base
9292 static const basic_json<Char> an_array;
9393 static const basic_json<Char> null;
9494
95+ typedef json_object<Char> object_type;
96+ typedef json_array<Char> array_type;
97+
9598 typedef typename json_object<Char>::iterator object_iterator;
9699 typedef typename json_object<Char>::const_iterator const_object_iterator;
97100
@@ -113,6 +116,12 @@ class basic_json : private json_base
113116 return val_.has_member (name);
114117 }
115118
119+ template <typename T>
120+ bool is () const
121+ {
122+ return val_.template is <T>();
123+ }
124+
116125 bool is_null () const
117126 {
118127 return val_.is_null ();
@@ -183,6 +192,12 @@ class basic_json : private json_base
183192 return val_.as_string (format);
184193 }
185194
195+ template <typename T>
196+ T as () const
197+ {
198+ return val_.template as <T>();
199+ }
200+
186201 Char as_char () const
187202 {
188203 return val_.as_char ();
@@ -368,6 +383,12 @@ class basic_json : private json_base
368383 val_.at (name_).resize_array (n,val);
369384 }
370385
386+ template <typename T>
387+ bool is () const
388+ {
389+ return val_.at (name_).template is <T>();
390+ }
391+
371392 bool is_string () const
372393 {
373394 return val_.at (name_).is_string ();
@@ -423,6 +444,12 @@ class basic_json : private json_base
423444 return val_.at (name_).as_string (format);
424445 }
425446
447+ template <typename T>
448+ T as () const
449+ {
450+ return val_.at (name_).template as <T>();
451+ }
452+
426453 Char as_char () const
427454 {
428455 return val_.at (name_).as_char ();
@@ -777,6 +804,12 @@ class basic_json : private json_base
777804
778805 bool has_member (const std::basic_string<Char>& name) const ;
779806
807+ template <typename T>
808+ bool is () const
809+ {
810+ return is_type<Char,T>(*this );
811+ }
812+
780813 bool is_string () const
781814 {
782815 return type_ == string_t ;
@@ -832,6 +865,12 @@ class basic_json : private json_base
832865
833866 void resize_array (size_t n, const basic_json<Char>& val);
834867
868+ template <typename T>
869+ T as () const
870+ {
871+ return as_value<Char,T>(*this );
872+ }
873+
835874 bool as_bool () const ;
836875
837876 double as_double () const ;
@@ -957,6 +996,184 @@ class basic_json : private json_base
957996private:
958997 basic_json (value_type t);
959998
999+ template <typename C, typename T>
1000+ class is_type
1001+ {
1002+ public:
1003+ is_type (const basic_json<C>& value)
1004+ {}
1005+
1006+ operator bool () const
1007+ {
1008+ return false ;
1009+ }
1010+ };
1011+ template <typename C>
1012+ class is_type <C,std::basic_string<C>>
1013+ {
1014+ public:
1015+ is_type (const basic_json<C>& value) : value_(value)
1016+ {}
1017+
1018+ operator bool () const
1019+ {
1020+ return value_.is_string ();
1021+ }
1022+
1023+ private:
1024+ const basic_json<C>& value_;
1025+ };
1026+ template <typename C>
1027+ class is_type <C,bool >
1028+ {
1029+ public:
1030+ is_type (const basic_json<C>& value) : value_(value)
1031+ {}
1032+
1033+ operator bool () const
1034+ {
1035+ return value_.is_bool ();
1036+ }
1037+
1038+ private:
1039+ const basic_json<C>& value_;
1040+ };
1041+ template <typename C>
1042+ class is_type <C,double >
1043+ {
1044+ public:
1045+ is_type (const basic_json<C>& value) : value_(value)
1046+ {}
1047+
1048+ operator bool () const
1049+ {
1050+ return value_.is_double ();
1051+ }
1052+
1053+ private:
1054+ const basic_json<C>& value_;
1055+ };
1056+ template <typename C>
1057+ class is_type <C,int >
1058+ {
1059+ public:
1060+ is_type (const basic_json<C>& value) : value_(value)
1061+ {}
1062+
1063+ operator bool () const
1064+ {
1065+ return value_.is_longlong ();
1066+ }
1067+
1068+ private:
1069+ const basic_json<C>& value_;
1070+ };
1071+ template <typename C>
1072+ class is_type <C,unsigned int >
1073+ {
1074+ public:
1075+ is_type (const basic_json<C>& value) : value_(value)
1076+ {}
1077+
1078+ operator bool () const
1079+ {
1080+ return value_.is_ulonglong ();
1081+ }
1082+
1083+ private:
1084+ const basic_json<C>& value_;
1085+ };
1086+ template <typename C>
1087+ class is_type <C,long >
1088+ {
1089+ public:
1090+ is_type (const basic_json<C>& value) : value_(value)
1091+ {}
1092+
1093+ operator bool () const
1094+ {
1095+ return value_.is_longlong ();
1096+ }
1097+
1098+ private:
1099+ const basic_json<C>& value_;
1100+ };
1101+ template <typename C>
1102+ class is_type <C,unsigned long >
1103+ {
1104+ public:
1105+ is_type (const basic_json<C>& value) : value_(value)
1106+ {}
1107+
1108+ operator bool () const
1109+ {
1110+ return value_.is_ulonglong ();
1111+ }
1112+
1113+ private:
1114+ const basic_json<C>& value_;
1115+ };
1116+ template <typename C>
1117+ class is_type <C,long long >
1118+ {
1119+ public:
1120+ is_type (const basic_json<C>& value) : value_(value)
1121+ {}
1122+
1123+ operator bool () const
1124+ {
1125+ return value_.is_longlong ();
1126+ }
1127+
1128+ private:
1129+ const basic_json<C>& value_;
1130+ };
1131+ template <typename C>
1132+ class is_type <C,unsigned long long >
1133+ {
1134+ public:
1135+ is_type (const basic_json<C>& value) : value_(value)
1136+ {}
1137+
1138+ operator bool () const
1139+ {
1140+ return value_.is_ulonglong ();
1141+ }
1142+
1143+ private:
1144+ const basic_json<C>& value_;
1145+ };
1146+ template <typename C>
1147+ class is_type <C,object_type>
1148+ {
1149+ public:
1150+ is_type (const basic_json<C>& value) : value_(value)
1151+ {}
1152+
1153+ operator bool () const
1154+ {
1155+ return value_.is_object ();
1156+ }
1157+
1158+ private:
1159+ const basic_json<C>& value_;
1160+ };
1161+ template <typename C>
1162+ class is_type <C,array_type>
1163+ {
1164+ public:
1165+ is_type (const basic_json<C>& value) : value_(value)
1166+ {}
1167+
1168+ operator bool () const
1169+ {
1170+ return value_.is_array ();
1171+ }
1172+
1173+ private:
1174+ const basic_json<C>& value_;
1175+ };
1176+
9601177 template <typename C, typename T>
9611178 class as_value
9621179 {
0 commit comments