c++ - 如何查询一个类型是否为models Struct?

标签 c++ boost-hana

给定一个类型 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_vstd::vector<int> ,我在 clang (trunk) 中收到以下错误:

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

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

最佳答案

好吧,那是愚蠢的。发帖后我才意识到我可以使用错误信息来解决我的问题!所以hana::Struct<foo_t>::valuetrue , 而 hana::Struct<std::vector<int>>false .

关于c++ - 如何查询一个类型是否为models Struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48316003/

相关文章:

c++ - 使用 lambda 和定点组合器递归访问 `std::variant`

c++ - 为 Intellisense/对象浏览器等记录 COM 对象

c++ - GCC:由于数据类型的范围有限,比较总是正确的——在模板参数中?

c++ - mailto:在没有安装邮件客户端的 URL 中

c++ - Boost::Hana 元组,修改值的最佳方式

c++ - 如何分配给结构对象的成员?

c++ - 调试时看不到任何变量值

c++ - 如何评估应该在 C++ 中采用 Tcl_Obj 的 Tcl 表达式

c++ - 用于创建 integral_constants 的任意元组的通用实用程序

c++ - 如何为 Hana 序列编写 for 循环?