Enable compilation for all types

This commit is contained in:
Victor Zverovich 2020-06-12 13:24:49 -07:00
parent 2d71d7e030
commit 16637341b9
2 changed files with 10 additions and 7 deletions

View File

@ -468,15 +468,11 @@ constexpr auto compile_format_string(S format_str) {
return parse_tail<Args, POS + 2, ID>(make_text(str, POS, 1), format_str);
} else if constexpr (str[POS + 1] == '}') {
using type = get_type<ID, Args>;
if constexpr (std::is_same<type, int>::value) {
return parse_tail<Args, POS + 2, ID + 1>(field<char_type, type, ID>(),
format_str);
} else {
return unknown_format();
}
} else {
return unknown_format();
}
} else if constexpr (str[POS] == '}') {
if (POS + 1 == str.size())
throw format_error("unmatched '}' in format string");
@ -565,7 +561,7 @@ FMT_INLINE std::basic_string<typename S::char_type> format(S, Args&&... args) {
if (str.size() == 2 && str[0] == '{' && str[1] == '}')
return fmt::to_string(detail::first(args...));
constexpr auto compiled = compile<Args...>(S());
return format(compiled, std::forward<Args...>(args...));
return format(compiled, std::forward<Args>(args)...);
}
template <typename OutputIt, typename CompiledFormat, typename... Args,

View File

@ -142,3 +142,10 @@ TEST(CompileTest, EmptyFormatString) {
auto f = fmt::compile<>("");
EXPECT_EQ(fmt::format(f), "");
}
#ifdef __cpp_if_constexpr
TEST(CompileTest, Basic) {
EXPECT_EQ("42", fmt::format(FMT_COMPILE("{}"), 42));
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), "foo"));
}
#endif