Skip to content

Commit 22d50c1

Browse files
phprusvitaut
authored andcommitted
Add support formatting std::expected<void, E>
Signed-off-by: Vladislav Shchapov <[email protected]>
1 parent 1cc10ab commit 22d50c1

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

include/fmt/std.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,8 @@ FMT_BEGIN_NAMESPACE
279279
FMT_EXPORT
280280
template <typename T, typename E, typename Char>
281281
struct formatter<std::expected<T, E>, Char,
282-
std::enable_if_t<is_formattable<T, Char>::value &&
282+
std::enable_if_t<(std::is_void<T>::value ||
283+
is_formattable<T, Char>::value) &&
283284
is_formattable<E, Char>::value>> {
284285
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
285286
return ctx.begin();
@@ -292,7 +293,8 @@ struct formatter<std::expected<T, E>, Char,
292293

293294
if (value.has_value()) {
294295
out = detail::write<Char>(out, "expected(");
295-
out = detail::write_escaped_alternative<Char>(out, *value);
296+
if constexpr (!std::is_void<T>::value)
297+
out = detail::write_escaped_alternative<Char>(out, *value);
296298
} else {
297299
out = detail::write<Char>(out, "unexpected(");
298300
out = detail::write_escaped_alternative<Char>(out, value.error());

test/std-test.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ TEST(std_test, optional) {
140140

141141
TEST(std_test, expected) {
142142
#ifdef __cpp_lib_expected
143+
EXPECT_EQ(fmt::format("{}", std::expected<void, int>{}), "expected()");
143144
EXPECT_EQ(fmt::format("{}", std::expected<int, int>{1}), "expected(1)");
144145
EXPECT_EQ(fmt::format("{}", std::expected<int, int>{std::unexpected(1)}),
145146
"unexpected(1)");
@@ -163,6 +164,7 @@ TEST(std_test, expected) {
163164
EXPECT_FALSE(
164165
(fmt::is_formattable<std::expected<int, unformattable2>>::value));
165166
EXPECT_TRUE((fmt::is_formattable<std::expected<int, int>>::value));
167+
EXPECT_TRUE((fmt::is_formattable<std::expected<void, int>>::value));
166168
#endif
167169
}
168170

0 commit comments

Comments
 (0)