Fix a conflict between fmt::join and fmt/ostream.h (#744)

This commit is contained in:
Victor Zverovich 2018-05-21 20:21:06 -07:00
parent 6ebc1a967d
commit 5ad54256c5
2 changed files with 19 additions and 6 deletions

View File

@ -53,10 +53,10 @@ struct test_stream : std::basic_ostream<Char> {
void operator<<(null); void operator<<(null);
}; };
// Disable conversion to int if T has an overloaded operator<< which is a free // Checks if T has an overloaded operator<< which is a free function (not a
// function (not a member of std::ostream). // member of std::ostream).
template <typename T, typename Char> template <typename T, typename Char>
class convert_to_int<T, Char, true> { class is_streamable {
private: private:
template <typename U> template <typename U>
static decltype( static decltype(
@ -69,7 +69,16 @@ class convert_to_int<T, Char, true> {
typedef decltype(test<T>(0)) result; typedef decltype(test<T>(0)) result;
public: public:
static const bool value = !result::value; static const bool value = result::value;
};
// Disable conversion to int if T has an overloaded operator<< which is a free
// function (not a member of std::ostream).
template <typename T, typename Char>
class convert_to_int<T, Char, true> {
public:
static const bool value =
convert_to_int<T, Char, false>::value && !is_streamable<T, Char>::value;
}; };
// Write the content of buf to os. // Write the content of buf to os.
@ -106,8 +115,7 @@ struct format_enum<T,
// Formats an object of type T that has an overloaded ostream operator<<. // Formats an object of type T that has an overloaded ostream operator<<.
template <typename T, typename Char> template <typename T, typename Char>
struct formatter<T, Char, struct formatter<T, Char,
typename std::enable_if<!internal::format_type< typename std::enable_if<internal::is_streamable<T, Char>::value>::type>
typename buffer_context<Char>::type, T>::value>::type>
: formatter<basic_string_view<Char>, Char> { : formatter<basic_string_view<Char>, Char> {
template <typename Context> template <typename Context>

View File

@ -158,3 +158,8 @@ TEST(OStreamTest, WriteToOStreamMaxSize) {
} while (size != 0); } while (size != 0);
fmt::internal::write(os, buffer); fmt::internal::write(os, buffer);
} }
TEST(OStreamTest, Join) {
int v[3] = {1, 2, 3};
EXPECT_EQ("1, 2, 3", fmt::format("{}", fmt::join(v, v + 3, ", ")));
}