diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2020-07-28 18:58:57 +0200 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2020-07-28 18:58:57 +0200 |
| commit | 7cbfe1904ce32e4d956d7a819ec6d851f51bc5ec (patch) | |
| tree | 2c540dd683d0a42e62382ac58048bb0270885a0a | |
| parent | 3d3739df002071b6d45b94683681a4c64f4fdb52 (diff) | |
| download | cxxformat-7cbfe1904ce32e4d956d7a819ec6d851f51bc5ec.tar.gz cxxformat-7cbfe1904ce32e4d956d7a819ec6d851f51bc5ec.zip | |
Use concepts instead of SFINAE where possible
| -rw-r--r-- | cxxformat.hpp | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/cxxformat.hpp b/cxxformat.hpp index 61a800e..47c0cd7 100644 --- a/cxxformat.hpp +++ b/cxxformat.hpp @@ -19,6 +19,7 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN #include <cstring> #include <stdexcept> #include <cstdint> +#include <concepts> namespace format { @@ -36,20 +37,20 @@ struct ImplicitConversion } }; -template<typename From> -struct FormatConvert<std::intmax_t, From, std::enable_if_t<std::is_signed_v<From> && std::is_integral_v<From>>> : ImplicitConversion<std::intmax_t, From> {}; +template<std::signed_integral From> +struct FormatConvert<std::intmax_t, From> : ImplicitConversion<std::intmax_t, From> {}; -template<typename From> -struct FormatConvert<std::intmax_t, From, std::enable_if_t<std::is_unsigned_v<From> && std::is_integral_v<From> && (sizeof(From) < sizeof(std::intmax_t))>> : ImplicitConversion<std::intmax_t, From> {}; +template<std::unsigned_integral From> +struct FormatConvert<std::intmax_t, From, std::enable_if_t<(sizeof(From) < sizeof(std::intmax_t))>> : ImplicitConversion<std::intmax_t, From> {}; -template<typename From> -struct FormatConvert<std::uintmax_t, From, std::enable_if_t<std::is_unsigned_v<From> && std::is_integral_v<From>>> : ImplicitConversion<std::uintmax_t, From> {}; +template<std::unsigned_integral From> +struct FormatConvert<std::uintmax_t, From> : ImplicitConversion<std::uintmax_t, From> {}; -template<typename String> -struct FormatConvert<std::string_view, String, std::enable_if_t<std::is_convertible_v<String, std::string_view>>> : ImplicitConversion<std::string_view, const String &> {}; +template<std::convertible_to<std::string_view> String> +struct FormatConvert<std::string_view, String> : ImplicitConversion<std::string_view, const String &> {}; -template<typename From> -struct FormatConvert<double, From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>> : ImplicitConversion<double, const From &> {}; +template<std::floating_point From> +struct FormatConvert<long double, From> : ImplicitConversion<long double, const From &> {}; template<typename Pointer> struct FormatConvert<const void *, Pointer, std::enable_if_t<std::is_pointer_v<Pointer> && !std::is_array_v<std::remove_pointer_t<Pointer>>>> : ImplicitConversion<const void *, const Pointer> {}; @@ -75,17 +76,17 @@ struct SimpleAutoConversion } }; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_unsigned_v<From>>> : SimpleAutoConversion<'u', From> {}; +template<std::unsigned_integral From> +struct AutoConversion<From> : SimpleAutoConversion<'u', From> {}; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_integral_v<From> && std::is_signed_v<From>>> : SimpleAutoConversion<'d', From> {}; +template<std::signed_integral From> +struct AutoConversion<From> : SimpleAutoConversion<'d', From> {}; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, double> && !std::is_integral_v<From>>> : SimpleAutoConversion<'G', From> {}; +template<std::floating_point From> +struct AutoConversion<From> : SimpleAutoConversion<'G', From> {}; -template<typename From> -struct AutoConversion<From, std::enable_if_t<std::is_convertible_v<From, std::string_view>>> : SimpleAutoConversion<'s', From> {}; +template<std::convertible_to<std::string_view> From> +struct AutoConversion<From> : SimpleAutoConversion<'s', From> {}; template<> struct AutoConversion<char> : SimpleAutoConversion<'c', const char> {}; |
