Fix ambiguous overloads of format & format_to

This commit is contained in:
Victor Zverovich 2020-03-05 11:43:33 -08:00
parent 153f753bde
commit 8a06ca84c7

View File

@ -351,6 +351,8 @@ template <int N, typename... Args> struct get_type_impl<N, type_list<Args...>> {
template <int N, typename T> template <int N, typename T>
using get_type = typename get_type_impl<N, T>::type; using get_type = typename get_type_impl<N, T>::type;
template <typename T> struct is_static_compiled_format : std::false_type {};
template <typename Char> struct text { template <typename Char> struct text {
basic_string_view<Char> data; basic_string_view<Char> data;
using char_type = Char; using char_type = Char;
@ -362,6 +364,9 @@ template <typename Char> struct text {
} }
}; };
template <typename Char>
struct is_static_compiled_format<text<Char>> : std::true_type {};
template <typename Char> template <typename Char>
constexpr text<Char> make_text(basic_string_view<Char> s, size_t pos, constexpr text<Char> make_text(basic_string_view<Char> s, size_t pos,
size_t size) { size_t size) {
@ -407,6 +412,9 @@ template <typename Char, typename T, int N> struct field {
} }
}; };
template <typename Char, typename T, int N>
struct is_static_compiled_format<field<Char, T, N>> : std::true_type {};
template <typename L, typename R> struct concat { template <typename L, typename R> struct concat {
L lhs; L lhs;
R rhs; R rhs;
@ -419,6 +427,9 @@ template <typename L, typename R> struct concat {
} }
}; };
template <typename L, typename R>
struct is_static_compiled_format<concat<L, R>> : std::true_type {};
template <typename L, typename R> template <typename L, typename R>
constexpr concat<L, R> make_concat(L lhs, R rhs) { constexpr concat<L, R> make_concat(L lhs, R rhs) {
return {lhs, rhs}; return {lhs, rhs};
@ -507,19 +518,19 @@ constexpr auto compile(S format_str) {
} }
} }
template <typename CompiledFormat, typename... Args, template <
typename Char = typename CompiledFormat::char_type, typename CompiledFormat, typename... Args,
FMT_ENABLE_IF(!std::is_base_of<internal::basic_compiled_format, typename Char = typename CompiledFormat::char_type,
CompiledFormat>::value)> FMT_ENABLE_IF(internal::is_static_compiled_format<CompiledFormat>::value)>
std::basic_string<Char> format(const CompiledFormat& cf, const Args&... args) { std::basic_string<Char> format(const CompiledFormat& cf, const Args&... args) {
basic_memory_buffer<Char> buffer; basic_memory_buffer<Char> buffer;
cf.format(std::back_inserter(buffer), args...); cf.format(std::back_inserter(buffer), args...);
return to_string(buffer); return to_string(buffer);
} }
template <typename OutputIt, typename CompiledFormat, typename... Args, template <
FMT_ENABLE_IF(!std::is_base_of<internal::basic_compiled_format, typename OutputIt, typename CompiledFormat, typename... Args,
CompiledFormat>::value)> FMT_ENABLE_IF(internal::is_static_compiled_format<CompiledFormat>::value)>
OutputIt format_to(OutputIt out, const CompiledFormat& cf, OutputIt format_to(OutputIt out, const CompiledFormat& cf,
const Args&... args) { const Args&... args) {
return cf.format(out, args...); return cf.format(out, args...);