给定类型T
,我想知道该类型是否满足Boost.Hana的Struct
概念。换句话说,我想构建一个元函数is_struct_v
,以便
struct foo_t { int x; }
BOOST_HANA_ADAPT_STRUCT(foo_t, x);
以下代码编译:
static_assert(is_struct_v<foo_t>);
而is_struct_v<std::vector<int>>
应该返回false。
我的猜测是hana的is_valid
“函数”适用于此,但是,我无法根据自己的意愿弯曲编译器。这是我的尝试:
#include <boost/hana.hpp>
namespace hana = boost::hana;
template <typename TypeTag>
constexpr auto is_struct(TypeTag t) {
auto has_members = hana::is_valid([](auto v)
-> decltype((void)(boost::hana::members(hana::traits::declval(v))))
{});
return has_members(t);
}
template <typename T>
constexpr bool is_struct_v = is_struct(boost::hana::type_c<T>);
这确实会为true
案例返回foo_t
,但当我尝试将is_struct_v
应用于std::vector<int>
时,我在clang(trunk)中收到以下错误:< / p>
static_assert failed due to requirement 'hana::Struct<S>::value'
更新:我已经解决了自己的问题;见下面的答案。也就是说,我仍然会理解为什么使用hana::members
的版本不起作用的原因。我发现static_assert
触发编译时错误很奇怪,因为我认为is_valid
应该是SFINAE。我错过了什么?
答案 0 :(得分:1)
hana::Struct<foo_t>::value
为true
,而hana::Struct<std::vector<int>>
为false
。