如何查询类型是否建模结构

How to query whether a type models Struct?

本文关键字:类型 是否 建模 结构 查询 何查询      更新时间:2023-10-16

给定一个类型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>);

对于foo_t情况,这确实会返回true,但是当我尝试将is_struct_v应用于std::vector<int>时,我在clang(trunk(中出现以下错误:

static_assert failed due to requirement 'hana::Struct<S>::value'

更新:我已经解决了自己的问题;请参阅下面的答案。也就是说,我仍然希望解释为什么使用hana::members的版本不起作用。我觉得static_assert触发编译时错误很奇怪,因为我认为is_valid应该把它带走。我错过了什么?

嗯,这很愚蠢。只有在发布后,我才意识到我可以使用错误消息来解决我的问题!所以hana::Struct<foo_t>::valuetrue,而hana::Struct<std::vector<int>>false