-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
allow format_as() to format reference #3739
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR!
include/fmt/core.h
Outdated
@@ -1332,7 +1332,7 @@ using ulong_type = conditional_t<long_short, unsigned, unsigned long long>; | |||
template <typename T> struct format_as_result { | |||
template <typename U, | |||
FMT_ENABLE_IF(std::is_enum<U>::value || std::is_class<U>::value)> | |||
static auto map(U*) -> decltype(format_as(std::declval<U>())); | |||
static auto map(U*) -> typename std::decay<decltype(format_as(std::declval<U>()))>::type; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this should be remove_cvref_t
and not decay
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes. it's a better fit in this case.
test/format-test.cc
Outdated
struct struct_as_const_reference { | ||
const std::string name = "foo"; | ||
}; | ||
auto format_as(const struct_as_const_reference& s) -> const std::string& { return s.name; } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please apply clang-format.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sure.
v2:
|
before this change, format_as() is unable to format a type which has `auto format_as() -> const another_type&`, and `another_type` is formattable. because `format_as_result` maps the result type as it is, and the compiler refuses to compile `static_cast<T*>(nullptr)`, where T is a reference type. but it would be handy if we could use `format_as()` to format types which, for instance, owns / inherit from a formattable type, and delegate the formatter to these variables instead without creating a copy of them. in this change: * instruct `format_as_result` to map the result type to the decayed type, so that `type` can be the decayed type of result type, and this also enables `type` to be formattable, as long as the decayed type is formattable. * corresponding test is added to format-test.cc Signed-off-by: Kefu Chai <[email protected]>
Merged, thanks! |
before this change, format_as() is unable to format a type which has `auto format_as() -> const another_type&`, and `another_type` is formattable. because `format_as_result` maps the result type as it is, and the compiler refuses to compile `static_cast<T*>(nullptr)`, where T is a reference type. but it would be handy if we could use `format_as()` to format types which, for instance, owns / inherit from a formattable type, and delegate the formatter to these variables instead without creating a copy of them. in this change: * instruct `format_as_result` to map the result type to the decayed type, so that `type` can be the decayed type of result type, and this also enables `type` to be formattable, as long as the decayed type is formattable. * corresponding test is added to format-test.cc Signed-off-by: Kefu Chai <[email protected]>
before this change, format_as() is unable to format a type which has
auto format_as() -> const another_type&
, andanother_type
is formattable. becauseformat_as_result
maps the result type as it is, and the compiler refuses to compilestatic_cast<T*>(nullptr)
, where T is a reference type. but it would be handy if we could useformat_as()
to format types which, for instance, owns / inherit from a formattable type, and delegate the formatter to these variables instead without creating a copy of them.in this change:
format_as_result
to map the result type to the decayed type, so thattype
can be the decayed type of result type, and this also enablestype
to be formattable, as long as the decayed type is formattable.