我已经重新实现了boost :: hana :: is_valid用于学习目的.用例是:
struct Person {
std::string name;
};
int main()
{
auto has_name = is_valid([](auto&& t) -> decltype((void) t.name) {});
Person jon{"snow"};
static_assert(has_name(jon), "");
static_assert(!has_name(1), "");
}
执行:
namespace detail {
template<typename F>
struct is_valid_impl {
template<typename T, typename = std::result_of_t<F&&(T&&)>>
constexpr bool operator()(T&&) const noexcept { return true; }
constexpr bool operator()(...) const noexcept { return false; }
};
} // namespace detail
template<typename F>
constexpr auto is_valid(F&&)
{
return detail::is_valid_impl<F>{};
}
但是,我不知道为什么Hana的用户指南建议将所需成员的类型转换为无效(参见here);我们不能只使用decltype(t.name)而不是decltype((void)t.name)?
此外,铸造到空隙导致GCC中的测试结果为fail. 5.3,而没有演员代码works为GCC 5.1.可能是什么原因?
最佳答案 不能比文档更明确:
@snippet example/tutorial/introspection.cpp non_static_member_from_object
Notice how we cast the result of
x.member
tovoid
? This is to make sure
that our detection also works for types that can’t be returned from functions,
like array types.