環境
- fmt-8.1.1
- VisualStudio2019
fmt::formatでchar以外の文字列をフォーマットする
#include <fmt/xchar.h>
std::wstring wtext = fmt::format(L"{}",123);
std::u16string u16text = fmt::format(u"{}",123);
std::u32string u32text = fmt::format(U"{}",123);
fmt-8.1.1時点ではfmt/xchar.h
をインクルードすることでchar以外の型もフォーマットできます。
fmt-7.1.3以前であればfmt/format.h
でコンパイルできまます。
フォーマット文字列の型は出力したい文字列の型に合わせてください。
フォーマット文字列がwchar_tなのに引数にcharやchar16_tの文字列を渡すとコンパイルに失敗します。
fmt::formatter
の特殊化をすれば使用することは可能です。
ユーザ定義型をchar以外にフォーマットする
struct Point{
int x,y;
}
template <> struct fmt::formatter<Point, wchar_t> {
// 書式パース
template<typename ParseContext>
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
return ctx.end();
}
// フォーマット
template<typename FormatContext>
auto format(const Point& point, FormatContext& ctx) -> decltype(ctx.out()) {
return format_to(ctx.out(), L"({},{})", point.x, point.y);
}
};
fmt::formatter
のテンプレート引数の第2引数に変換先のフォーマットを設定して下さい。
fmtlibのリファレンスだとわかりづらいですが、std::formatterのページに詳しい使用が書いてあります。
cpprefjp
サンプルではParseContextとFormatContextのようにテンプレート化していますが、私の環境では
ParseContext
→fmt::v8::basic_format_parse_context<wchar_t>
FormatContext
→fmt::v8::buffer_context<wchar_t>
として呼ばれていました。特に理由がなければテンプレートのままで良いと思います。