base: Narrow the applicability of the default to_number.
authorGabe Black <gabe.black@gmail.com>
Wed, 21 Oct 2020 02:11:07 +0000 (19:11 -0700)
committerGabe Black <gabe.black@gmail.com>
Thu, 22 Oct 2020 22:01:16 +0000 (22:01 +0000)
That template only works for integral (except bool), floating point,
or enum types, so restrict it to those types. That makes it easier to
detect what types will work with that function.

Change-Id: Ib29a9a0ea75dd617e28bb6850d60be905f93182f
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/36279
Reviewed-by: Gabe Black <gabe.black@gmail.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/str.hh

index 5e56e622d87f42b461a6db26595ef65430cde1c8..8c05a8d13156a6efc213393a46c5fa27138b0456 100644 (file)
@@ -156,15 +156,18 @@ __to_number(const std::string &value)
 /** @} */
 
 /**
- * Turn a string representation of a number, either integral or
- * floating point, into an actual number.
+ * Turn a string representation of a number, either integral, floating point,
+ * or enum into an actual number. Use to_bool for booleans.
  *
  * @param value The string representing the number
  * @param retval The resulting value
  * @return True if the parsing was successful
  */
 template <class T>
-inline bool
+inline std::enable_if_t<(std::is_integral<T>::value ||
+                         std::is_floating_point<T>::value ||
+                         std::is_enum<T>::value) &&
+                        !std::is_same<bool, T>::value, bool>
 to_number(const std::string &value, T &retval)
 {
     try {