diff --git a/include/fmt/format.h b/include/fmt/format.h index 3092aa9b..1c116f81 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -3217,22 +3217,22 @@ template inline const void* ptr(const std::shared_ptr& p) { return p.get(); } -template +template struct arg_join : internal::view { It first; - It last; + S last; basic_string_view sep; - arg_join(It b, It e, basic_string_view s) : first(b), last(e), sep(s) {} + arg_join(It f, S l, basic_string_view s) : first(f), last(l), sep(s) {} It begin() const { return first; } - It end() const { return last; } + S end() const { return last; } }; -template -struct formatter, Char> +template +struct formatter, Char> : formatter::value_type, Char> { template - auto format(const arg_join& value, FormatContext& ctx) + auto format(const arg_join& value, FormatContext& ctx) -> decltype(ctx.out()) { using base = formatter::value_type, Char>; auto it = value.begin(); @@ -3253,13 +3253,13 @@ struct formatter, Char> Returns an object that formats the iterator range `[begin, end)` with elements separated by `sep`. */ -template -arg_join join(It begin, It end, string_view sep) { +template +arg_join join(It begin, S end, string_view sep) { return {begin, end, sep}; } -template -arg_join join(It begin, It end, wstring_view sep) { +template +arg_join join(It begin, S end, wstring_view sep) { return {begin, end, sep}; } @@ -3275,13 +3275,15 @@ arg_join join(It begin, It end, wstring_view sep) { \endrst */ template -arg_join, char> +arg_join, internal::iterator_t, + char> join(const Range& range, string_view sep) { return join(std::begin(range), std::end(range), sep); } template -arg_join, wchar_t> +arg_join, internal::iterator_t, + wchar_t> join(const Range& range, wstring_view sep) { return join(std::begin(range), std::end(range), sep); }