11
11
12
12
#include < functional>
13
13
#include < map>
14
- #include < memory>
15
14
#include < string>
16
- #include < type_traits> // std::enable_if,std:: enable_if_t
15
+ #include < type_traits> // std::enable_if_t
17
16
#include < utility>
18
17
#include < vector>
19
18
@@ -223,6 +222,14 @@ class JsonObject : public Value {
223
222
~JsonObject () override = default ;
224
223
};
225
224
225
+ namespace detail {
226
+ template <typename T, typename U>
227
+ using IsSameT = std::enable_if_t <std::is_same_v<std::remove_cv_t <T>, std::remove_cv_t <U>>>;
228
+
229
+ template <typename T>
230
+ using IsF64T = std::enable_if_t <std::is_same_v<T, double >>;
231
+ } // namespace detail
232
+
226
233
class JsonNumber : public Value {
227
234
public:
228
235
using Float = float ;
@@ -232,15 +239,11 @@ class JsonNumber : public Value {
232
239
233
240
public:
234
241
JsonNumber () : Value(ValueKind::kNumber ) {}
235
- template <typename FloatT,
236
- typename std::enable_if<std::is_same<FloatT, Float>::value>::type* = nullptr >
237
- JsonNumber (FloatT value) : Value(ValueKind::kNumber ) { // NOLINT
238
- number_ = value;
239
- }
240
- template <typename FloatT,
241
- typename std::enable_if<std::is_same<FloatT, double >::value>::type* = nullptr >
242
- JsonNumber (FloatT value) : Value{ValueKind::kNumber }, // NOLINT
243
- number_{static_cast <Float>(value)} {}
242
+ template <typename FloatT, typename detail::IsSameT<FloatT, Float>* = nullptr >
243
+ JsonNumber (FloatT value) : Value(ValueKind::kNumber ), number_{value} {} // NOLINT
244
+ template <typename FloatT, typename detail::IsF64T<FloatT>* = nullptr >
245
+ JsonNumber (FloatT value) // NOLINT
246
+ : Value{ValueKind::kNumber }, number_{static_cast <Float>(value)} {}
244
247
JsonNumber (JsonNumber const & that) = delete ;
245
248
JsonNumber (JsonNumber&& that) noexcept : Value{ValueKind::kNumber }, number_{that.number_ } {}
246
249
@@ -258,6 +261,13 @@ class JsonNumber : public Value {
258
261
}
259
262
};
260
263
264
+ namespace detail {
265
+ template <typename IntT>
266
+ using Not32SizeT = std::enable_if_t <std::is_same_v<IntT, std::uint32_t > &&
267
+ !std::is_same_v<std::size_t , std::uint32_t >>;
268
+ }
269
+
270
+
261
271
class JsonInteger : public Value {
262
272
public:
263
273
using Int = int64_t ;
@@ -267,24 +277,18 @@ class JsonInteger : public Value {
267
277
268
278
public:
269
279
JsonInteger () : Value(ValueKind::kInteger ) {} // NOLINT
280
+ template <typename IntT, typename detail::IsSameT<IntT, Int>* = nullptr >
281
+ JsonInteger (IntT value) : Value(ValueKind::kInteger ), integer_{value} {} // NOLINT
282
+ template <typename IntT, typename detail::IsSameT<IntT, std::size_t >* = nullptr >
283
+ JsonInteger (IntT value) // NOLINT
284
+ : Value(ValueKind::kInteger ), integer_{static_cast <Int>(value)} {}
285
+ template <typename IntT, typename detail::IsSameT<IntT, std::int32_t >* = nullptr >
286
+ JsonInteger (IntT value) // NOLINT
287
+ : Value(ValueKind::kInteger ), integer_{static_cast <Int>(value)} {}
270
288
template <typename IntT,
271
- typename std::enable_if<std::is_same<IntT, Int>::value>::type* = nullptr >
272
- JsonInteger (IntT value) : Value(ValueKind::kInteger ), integer_{value} {} // NOLINT
273
- template <typename IntT,
274
- typename std::enable_if<std::is_same<IntT, size_t >::value>::type* = nullptr >
275
- JsonInteger (IntT value) : Value(ValueKind::kInteger ), // NOLINT
276
- integer_{static_cast <Int>(value)} {}
277
- template <typename IntT,
278
- typename std::enable_if<std::is_same<IntT, int32_t >::value>::type* = nullptr >
279
- JsonInteger (IntT value) : Value(ValueKind::kInteger ), // NOLINT
280
- integer_{static_cast <Int>(value)} {}
281
- template <typename IntT,
282
- typename std::enable_if<
283
- std::is_same<IntT, uint32_t >::value &&
284
- !std::is_same<std::size_t , uint32_t >::value>::type * = nullptr >
289
+ typename detail::Not32SizeT<IntT>* = nullptr >
285
290
JsonInteger (IntT value) // NOLINT
286
- : Value(ValueKind::kInteger ),
287
- integer_{static_cast <Int>(value)} {}
291
+ : Value(ValueKind::kInteger ), integer_{static_cast <Int>(value)} {}
288
292
289
293
JsonInteger (JsonInteger &&that) noexcept
290
294
: Value{ValueKind::kInteger }, integer_{that.integer_ } {}
@@ -325,12 +329,8 @@ class JsonBoolean : public Value {
325
329
public:
326
330
JsonBoolean () : Value(ValueKind::kBoolean ) {} // NOLINT
327
331
// Ambigious with JsonNumber.
328
- template <typename Bool,
329
- typename std::enable_if<
330
- std::is_same<Bool, bool >::value ||
331
- std::is_same<Bool, bool const >::value>::type* = nullptr >
332
- JsonBoolean (Bool value) : // NOLINT
333
- Value (ValueKind::kBoolean ), boolean_{value} {}
332
+ template <typename Bool, typename detail::IsSameT<std::remove_cv_t <Bool>, bool >* = nullptr >
333
+ JsonBoolean (Bool value) : Value(ValueKind::kBoolean ), boolean_{value} {} // NOLINT
334
334
JsonBoolean (JsonBoolean&& value) noexcept : // NOLINT
335
335
Value (ValueKind::kBoolean ), boolean_{value.boolean_ } {}
336
336
@@ -506,71 +506,52 @@ bool IsA(Json const& j) {
506
506
507
507
namespace detail {
508
508
// Number
509
- template <typename T,
510
- typename std::enable_if<
511
- std::is_same<T, JsonNumber>::value>::type* = nullptr >
509
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonNumber>>* = nullptr >
512
510
JsonNumber::Float& GetImpl (T& val) { // NOLINT
513
511
return val.GetNumber ();
514
512
}
515
- template <typename T,
516
- typename std::enable_if<
517
- std::is_same<T, JsonNumber const >::value>::type* = nullptr >
513
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonNumber const >>* = nullptr >
518
514
JsonNumber::Float const & GetImpl (T& val) { // NOLINT
519
515
return val.GetNumber ();
520
516
}
521
517
522
518
// Integer
523
- template <typename T,
524
- typename std::enable_if<
525
- std::is_same<T, JsonInteger>::value>::type* = nullptr >
519
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonInteger>>* = nullptr >
526
520
JsonInteger::Int& GetImpl (T& val) { // NOLINT
527
521
return val.GetInteger ();
528
522
}
529
- template <typename T,
530
- typename std::enable_if<
531
- std::is_same<T, JsonInteger const >::value>::type* = nullptr >
523
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonInteger const >>* = nullptr >
532
524
JsonInteger::Int const & GetImpl (T& val) { // NOLINT
533
525
return val.GetInteger ();
534
526
}
535
527
536
528
// String
537
- template <typename T,
538
- typename std::enable_if<
539
- std::is_same<T, JsonString>::value>::type* = nullptr >
529
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonString>>* = nullptr >
540
530
std::string& GetImpl (T& val) { // NOLINT
541
531
return val.GetString ();
542
532
}
543
- template <typename T,
544
- typename std::enable_if<
545
- std::is_same<T, JsonString const >::value>::type* = nullptr >
533
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonString const >>* = nullptr >
546
534
std::string const & GetImpl (T& val) { // NOLINT
547
535
return val.GetString ();
548
536
}
549
537
550
538
// Boolean
551
- template <typename T,
552
- typename std::enable_if<
553
- std::is_same<T, JsonBoolean>::value>::type* = nullptr >
539
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonBoolean>>* = nullptr >
554
540
bool & GetImpl (T& val) { // NOLINT
555
541
return val.GetBoolean ();
556
542
}
557
543
template <typename T,
558
- typename std::enable_if<
559
- std::is_same<T, JsonBoolean const >::value>::type* = nullptr >
544
+ typename std::enable_if_t <std::is_same_v<T, JsonBoolean const >>* = nullptr >
560
545
bool const & GetImpl (T& val) { // NOLINT
561
546
return val.GetBoolean ();
562
547
}
563
548
564
549
// Array
565
- template <typename T,
566
- typename std::enable_if<
567
- std::is_same<T, JsonArray>::value>::type* = nullptr >
550
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonArray>>* = nullptr >
568
551
std::vector<Json>& GetImpl (T& val) { // NOLINT
569
552
return val.GetArray ();
570
553
}
571
- template <typename T,
572
- typename std::enable_if<
573
- std::is_same<T, JsonArray const >::value>::type* = nullptr >
554
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonArray const >>* = nullptr >
574
555
std::vector<Json> const & GetImpl (T& val) { // NOLINT
575
556
return val.GetArray ();
576
557
}
@@ -586,12 +567,11 @@ std::vector<T> const& GetImpl(JsonTypedArray<T, kind> const& val) {
586
567
}
587
568
588
569
// Object
589
- template <typename T, typename std::enable_if <std::is_same <T, JsonObject>::value>::type * = nullptr >
570
+ template <typename T, typename std::enable_if_t <std::is_same_v <T, JsonObject>> * = nullptr >
590
571
JsonObject::Map& GetImpl (T& val) { // NOLINT
591
572
return val.GetObject ();
592
573
}
593
- template <typename T,
594
- typename std::enable_if<std::is_same<T, JsonObject const >::value>::type* = nullptr >
574
+ template <typename T, typename std::enable_if_t <std::is_same_v<T, JsonObject const >>* = nullptr >
595
575
JsonObject::Map const & GetImpl (T& val) { // NOLINT
596
576
return val.GetObject ();
597
577
}
0 commit comments