@@ -36,14 +36,14 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
3636 }
3737
3838 // Construct from variant, array, or object
39- template <typename T>
40- JsonDocument (
41- const T& src, Allocator* alloc = detail::DefaultAllocator::instance(),
42- detail::enable_if_t <detail::IsVariant<T >::value ||
43- detail::is_same<T, JsonArray >::value ||
44- detail::is_same<T, JsonArrayConst >::value ||
45- detail::is_same<T, JsonObject>::value ||
46- detail::is_same<T, JsonObjectConst>::value>* = 0 )
39+ template <typename T, typename = detail:: enable_if_t <
40+ detail::IsVariant<T>::value ||
41+ detail::is_same<T, JsonArray>::value ||
42+ detail::is_same<T, JsonArrayConst >::value ||
43+ detail::is_same<T, JsonObject >::value ||
44+ detail::is_same<T, JsonObjectConst >::value>>
45+ JsonDocument ( const T& src,
46+ Allocator* alloc = detail::DefaultAllocator::instance() )
4747 : JsonDocument(alloc) {
4848 set (src);
4949 }
@@ -136,9 +136,9 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
136136
137137 // Replaces the root with the specified value.
138138 // https://arduinojson.org/v7/api/jsondocument/set/
139- template <typename T>
140- detail:: enable_if_t < !detail::is_base_of<JsonDocument, T>::value, bool > set (
141- const T& src) {
139+ template <typename T, typename = detail:: enable_if_t <
140+ !detail::is_base_of<JsonDocument, T>::value>>
141+ bool set ( const T& src) {
142142 return to<JsonVariant>().set (src);
143143 }
144144
@@ -168,68 +168,65 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
168168
169169 // DEPRECATED: use obj[key].is<T>() instead
170170 // https://arduinojson.org/v7/api/jsondocument/containskey/
171- template <typename TString>
171+ template <typename TString,
172+ detail::enable_if_t <detail::IsString<TString>::value, int > = 0 >
172173 ARDUINOJSON_DEPRECATED (" use doc[key].is<T>() instead" )
173- detail::enable_if_t <detail::IsString<TString>::value, bool > containsKey (
174- const TString& key) const {
174+ bool containsKey (const TString& key) const {
175175 return data_.getMember (detail::adaptString (key), &resources_) != 0 ;
176176 }
177177
178178 // DEPRECATED: use obj[key].is<T>() instead
179179 // https://arduinojson.org/v7/api/jsondocument/containskey/
180- template <typename TVariant>
180+ template <typename TVariant,
181+ detail::enable_if_t <detail::IsVariant<TVariant>::value, short > = 0 >
181182 ARDUINOJSON_DEPRECATED (" use doc[key].is<T>() instead" )
182- detail::enable_if_t <detail::IsVariant<TVariant>::value, bool > containsKey (
183- const TVariant& key) const {
183+ bool containsKey (const TVariant& key) const {
184184 return containsKey (key.template as <const char *>());
185185 }
186186
187187 // Gets or sets a root object's member.
188188 // https://arduinojson.org/v7/api/jsondocument/subscript/
189- template <typename TString>
190- detail::enable_if_t <
191- detail::IsString<TString>::value,
192- detail::MemberProxy<JsonDocument&, detail::AdaptedString<TString>>>
193- operator [](const TString& key) {
189+ template <typename TString,
190+ typename = detail::enable_if_t <detail::IsString<TString>::value>>
191+ detail::MemberProxy<JsonDocument&, detail::AdaptedString<TString>> operator [](
192+ const TString& key) {
194193 return {*this , detail::adaptString (key)};
195194 }
196195
197196 // Gets or sets a root object's member.
198197 // https://arduinojson.org/v7/api/jsondocument/subscript/
199- template <typename TChar>
200- detail::enable_if_t <
201- detail::IsString<TChar*>::value && !detail::is_const<TChar>::value,
202- detail::MemberProxy<JsonDocument&, detail::AdaptedString<TChar*>>>
203- operator []( TChar* key) {
198+ template <typename TChar,
199+ typename = detail::enable_if_t <detail::IsString<TChar*>::value &&
200+ !detail::is_const<TChar>::value>>
201+ detail::MemberProxy<JsonDocument&, detail::AdaptedString<TChar*>> operator [](
202+ TChar* key) {
204203 return {*this , detail::adaptString (key)};
205204 }
206205
207206 // Gets a root object's member.
208207 // https://arduinojson.org/v7/api/jsondocument/subscript/
209- template <typename TString>
210- detail::enable_if_t <detail::IsString<TString>::value, JsonVariantConst >
211- operator [](const TString& key) const {
208+ template <typename TString,
209+ typename = detail::enable_if_t <detail::IsString<TString>::value> >
210+ JsonVariantConst operator [](const TString& key) const {
212211 return JsonVariantConst (
213212 data_.getMember (detail::adaptString (key), &resources_), &resources_);
214213 }
215214
216215 // Gets a root object's member.
217216 // https://arduinojson.org/v7/api/jsondocument/subscript/
218- template <typename TChar>
219- detail::enable_if_t <detail::IsString<TChar*>::value &&
220- !detail::is_const<TChar>::value,
221- JsonVariantConst>
222- operator [](TChar* key) const {
217+ template <typename TChar,
218+ typename = detail::enable_if_t <detail::IsString<TChar*>::value &&
219+ !detail::is_const<TChar>::value>>
220+ JsonVariantConst operator [](TChar* key) const {
223221 return JsonVariantConst (
224222 data_.getMember (detail::adaptString (key), &resources_), &resources_);
225223 }
226224
227225 // Gets or sets a root array's element.
228226 // https://arduinojson.org/v7/api/jsondocument/subscript/
229- template <typename T>
230- detail::enable_if_t <detail::is_integral<T>::value,
231- detail::ElementProxy<JsonDocument&>>
232- operator [](T index) {
227+ template <typename T,
228+ detail::enable_if_t <detail::is_integral<T>::value, int > = 0 >
229+ detail::ElementProxy<JsonDocument&> operator [](T index) {
233230 return {*this , size_t (index)};
234231 }
235232
@@ -241,9 +238,9 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
241238
242239 // Gets or sets a root object's member.
243240 // https://arduinojson.org/v7/api/jsondocument/subscript/
244- template <typename TVariant>
245- detail::enable_if_t <detail::IsVariant<TVariant>::value, JsonVariantConst >
246- operator [](const TVariant& key) const {
241+ template <typename TVariant,
242+ detail::enable_if_t <detail::IsVariant<TVariant>::value, short > = 0 >
243+ JsonVariantConst operator [](const TVariant& key) const {
247244 if (key.template is <JsonString>())
248245 return operator [](key.template as <JsonString>());
249246 if (key.template is <size_t >())
@@ -254,16 +251,18 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
254251 // Appends a new (empty) element to the root array.
255252 // Returns a reference to the new element.
256253 // https://arduinojson.org/v7/api/jsondocument/add/
257- template <typename T>
258- detail::enable_if_t <!detail::is_same<T, JsonVariant>::value, T> add () {
254+ template <typename T, detail::enable_if_t <
255+ !detail::is_same<T, JsonVariant>::value, int > = 0 >
256+ T add () {
259257 return add<JsonVariant>().to <T>();
260258 }
261259
262260 // Appends a new (null) element to the root array.
263261 // Returns a reference to the new element.
264262 // https://arduinojson.org/v7/api/jsondocument/add/
265- template <typename T>
266- detail::enable_if_t <detail::is_same<T, JsonVariant>::value, T> add () {
263+ template <typename T, detail::enable_if_t <
264+ detail::is_same<T, JsonVariant>::value, short > = 0 >
265+ JsonVariant add () {
267266 return JsonVariant (data_.addElement (&resources_), &resources_);
268267 }
269268
@@ -284,36 +283,37 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
284283
285284 // Removes an element of the root array.
286285 // https://arduinojson.org/v7/api/jsondocument/remove/
287- template <typename T>
288- detail::enable_if_t <detail::is_integral<T>::value> remove (T index) {
286+ template <typename T,
287+ typename = detail::enable_if_t <detail::is_integral<T>::value>>
288+ void remove (T index) {
289289 detail::VariantData::removeElement (getData (), size_t (index),
290290 getResourceManager ());
291291 }
292292
293293 // Removes a member of the root object.
294294 // https://arduinojson.org/v7/api/jsondocument/remove/
295- template <typename TChar>
296- detail::enable_if_t <detail::IsString<TChar*>::value &&
297- !detail::is_const<TChar>::value>
298- remove (TChar* key) {
295+ template <typename TChar,
296+ typename = detail::enable_if_t <detail::IsString<TChar*>::value &&
297+ !detail::is_const<TChar>::value> >
298+ void remove (TChar* key) {
299299 detail::VariantData::removeMember (getData (), detail::adaptString (key),
300300 getResourceManager ());
301301 }
302302
303303 // Removes a member of the root object.
304304 // https://arduinojson.org/v7/api/jsondocument/remove/
305- template <typename TString>
306- detail::enable_if_t <detail::IsString<TString>::value> remove (
307- const TString& key) {
305+ template <typename TString,
306+ detail::enable_if_t <detail::IsString<TString>::value, int > = 0 >
307+ void remove ( const TString& key) {
308308 detail::VariantData::removeMember (getData (), detail::adaptString (key),
309309 getResourceManager ());
310310 }
311311
312312 // Removes a member of the root object or an element of the root array.
313313 // https://arduinojson.org/v7/api/jsondocument/remove/
314- template <typename TVariant>
315- detail::enable_if_t <detail::IsVariant<TVariant>::value> remove (
316- const TVariant& key) {
314+ template <typename TVariant,
315+ detail::enable_if_t <detail::IsVariant<TVariant>::value, short > = 0 >
316+ void remove ( const TVariant& key) {
317317 if (key.template is <const char *>())
318318 remove (key.template as <const char *>());
319319 if (key.template is <size_t >())
0 commit comments