mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-19 11:14:41 +00:00
Fix handling of streamable and convertible to string types
This commit is contained in:
parent
d19ed6716d
commit
0d07db1234
@ -905,6 +905,8 @@ template <typename Context> struct arg_mapper {
|
|||||||
}
|
}
|
||||||
template <typename T,
|
template <typename T,
|
||||||
FMT_ENABLE_IF(!is_string<T>::value && !is_char<T>::value &&
|
FMT_ENABLE_IF(!is_string<T>::value && !is_char<T>::value &&
|
||||||
|
!std::is_constructible<basic_string_view<char_type>,
|
||||||
|
T>::value &&
|
||||||
(has_formatter<T, Context>::value ||
|
(has_formatter<T, Context>::value ||
|
||||||
has_fallback_formatter<T, Context>::value))>
|
has_fallback_formatter<T, Context>::value))>
|
||||||
FMT_CONSTEXPR const T& map(const T& val) {
|
FMT_CONSTEXPR const T& map(const T& val) {
|
||||||
|
@ -635,19 +635,6 @@ TEST(FormatterTest, FormatExplicitlyConvertibleToWStringView) {
|
|||||||
EXPECT_EQ(L"foo",
|
EXPECT_EQ(L"foo",
|
||||||
fmt::format(L"{}", explicitly_convertible_to_wstring_view()));
|
fmt::format(L"{}", explicitly_convertible_to_wstring_view()));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct explicitly_convertible_to_string_like {
|
|
||||||
template <typename String,
|
|
||||||
typename = typename std::enable_if<std::is_constructible<
|
|
||||||
String, const char*, std::size_t>::value>::type>
|
|
||||||
explicit operator String() const {
|
|
||||||
return String("foo", 3u);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(FormatterTest, FormatExplicitlyConvertibleToStringLike) {
|
|
||||||
EXPECT_EQ("foo", fmt::format("{}", explicitly_convertible_to_string_like()));
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct disabled_rvalue_conversion {
|
struct disabled_rvalue_conversion {
|
||||||
|
@ -243,8 +243,7 @@ TEST(FormatTest, UDL) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <typename T>
|
template <typename T> struct convertible {
|
||||||
struct convertible {
|
|
||||||
T value;
|
T value;
|
||||||
explicit convertible(const T& val) : value(val) {}
|
explicit convertible(const T& val) : value(val) {}
|
||||||
operator T() const { return value; }
|
operator T() const { return value; }
|
||||||
@ -255,3 +254,25 @@ TEST(OStreamTest, DisableBuiltinOStreamOperators) {
|
|||||||
EXPECT_EQ(L"42", fmt::format(L"{:d}", convertible<unsigned short>(42)));
|
EXPECT_EQ(L"42", fmt::format(L"{:d}", convertible<unsigned short>(42)));
|
||||||
EXPECT_EQ("foo", fmt::format("{}", convertible<const char*>("foo")));
|
EXPECT_EQ("foo", fmt::format("{}", convertible<const char*>("foo")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct explicitly_convertible_to_string_like {
|
||||||
|
template <typename String,
|
||||||
|
typename = typename std::enable_if<std::is_constructible<
|
||||||
|
String, const char*, std::size_t>::value>::type>
|
||||||
|
explicit operator String() const {
|
||||||
|
return String("foo", 3u);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(FormatterTest, FormatExplicitlyConvertibleToStringLike) {
|
||||||
|
EXPECT_EQ("foo", fmt::format("{}", explicitly_convertible_to_string_like()));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& os,
|
||||||
|
explicitly_convertible_to_string_like) {
|
||||||
|
return os << "bar";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(FormatterTest, FormatExplicitlyConvertibleToStringLikeIgnoreInserter) {
|
||||||
|
EXPECT_EQ("foo", fmt::format("{}", explicitly_convertible_to_string_like()));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user