From ee0c3351a4d47ca89090b8a7458846288b18efca Mon Sep 17 00:00:00 2001 From: "Hans-Martin B. Jensen" <32485905+hmbj@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:30:48 +0200 Subject: [PATCH] Fix format_to + FMT_STRING for wide character type (#3931) Added overload that takes a wformat_string. Fixes issue #3925. --- include/fmt/xchar.h | 12 ++++++++++-- test/xchar-test.cc | 6 ++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/fmt/xchar.h b/include/fmt/xchar.h index 557dbe1d3adb..a6bf47fe5b27 100644 --- a/include/fmt/xchar.h +++ b/include/fmt/xchar.h @@ -141,6 +141,13 @@ auto format(wformat_string fmt, T&&... args) -> std::wstring { return vformat(fmt::wstring_view(fmt), fmt::make_wformat_args(args...)); } +template +auto format_to(OutputIt out, wformat_string fmt, T&&... args) + -> OutputIt { + return vformat_to(out, fmt::wstring_view(fmt), + fmt::make_wformat_args(args...)); +} + // Pass char_t as a default template parameter instead of using // std::basic_string> to reduce the symbol size. template , - FMT_ENABLE_IF(detail::is_output_iterator::value&& - detail::is_exotic_char::value)> + FMT_ENABLE_IF(detail::is_output_iterator::value && + !std::is_same::value && + !std::is_same::value)> inline auto format_to(OutputIt out, const S& fmt, T&&... args) -> OutputIt { return vformat_to(out, detail::to_string_view(fmt), fmt::make_format_args>(args...)); diff --git a/test/xchar-test.cc b/test/xchar-test.cc index 8f15a3479766..cbc961d360a5 100644 --- a/test/xchar-test.cc +++ b/test/xchar-test.cc @@ -195,6 +195,12 @@ TEST(xchar_test, format_to) { EXPECT_STREQ(buf.data(), L"42"); } +TEST(xchar_test, compile_time_string_format_to) { + std::wstring ws; + fmt::format_to(std::back_inserter(ws), FMT_STRING(L"{}"), 42); + EXPECT_EQ(L"42", ws); +} + TEST(xchar_test, vformat_to) { int n = 42; auto args = fmt::make_wformat_args(n);