如何查询一个类型是否为models Struct?
How to query whether a type models Struct?
给定一个类型 T
,我想知道该类型是否满足 Boost.Hana 的 Struct
概念。换句话说,我想构造一个元函数 is_struct_v
这样 for
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>>
应该 return false。
我的猜测是 hana 的 is_valid
"function" 适用于此,但是,我无法让编译器屈服于我的意志。这是我的尝试:
#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>);
return true
对于 foo_t
的情况,但是当我尝试将 is_struct_v
应用于 std::vector<int>
时,我在clang(中继线):
static_assert failed due to requirement 'hana::Struct<S>::value'
更新:我已经解决了我自己的问题;请参阅下面的答案。也就是说,我仍然希望能解释为什么使用 hana::members
的版本不起作用。我觉得 static_assert
触发编译时错误很奇怪,因为我认为 is_valid
应该让 SFINAE 消失。我错过了什么?
好吧,这很愚蠢。发帖后我才意识到我可以使用错误信息来解决我的问题!所以 hana::Struct<foo_t>::value
是 true
,而 hana::Struct<std::vector<int>>
是 false
.
给定一个类型 T
,我想知道该类型是否满足 Boost.Hana 的 Struct
概念。换句话说,我想构造一个元函数 is_struct_v
这样 for
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>>
应该 return false。
我的猜测是 hana 的 is_valid
"function" 适用于此,但是,我无法让编译器屈服于我的意志。这是我的尝试:
#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>);
return true
对于 foo_t
的情况,但是当我尝试将 is_struct_v
应用于 std::vector<int>
时,我在clang(中继线):
static_assert failed due to requirement 'hana::Struct<S>::value'
更新:我已经解决了我自己的问题;请参阅下面的答案。也就是说,我仍然希望能解释为什么使用 hana::members
的版本不起作用。我觉得 static_assert
触发编译时错误很奇怪,因为我认为 is_valid
应该让 SFINAE 消失。我错过了什么?
好吧,这很愚蠢。发帖后我才意识到我可以使用错误信息来解决我的问题!所以 hana::Struct<foo_t>::value
是 true
,而 hana::Struct<std::vector<int>>
是 false
.