Unfortunately, std::filesystem already crosses the WinAPI boundary (character type is OS dependent). I understand that explicitizing the conversions results in a neater design, but on the other hand the formatter specializations are somewhat explicit as well. Though, they target all (common) conversions indirectly vs one particular conversion directly. In that sense, it seems imho better to introduce a separate intermediary class for explicit non-common conversions as opposed to all conversions (e.g., why is the type std::string treated different from std::vector for formatting wchar_t streams? Both are just types for which the user needs to handle the formatting).