如何查询类型是否建模结构
How to query whether a type models Struct?
给定一个类型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>::value
是true
,而hana::Struct<std::vector<int>>
是false
。
相关文章:
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 检查函数返回类型是否与STL容器类型值相同
- 检查某些类型是否是模板类 std::optional 的实例化
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 如何检查模板类型是否可以从给定类型构造
- 用于检测函数类型是否为否的特征
- 了解类型是否可调用
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 键入特征以检查类型是否可从流和 MSVC 读取
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 如何获取类型是否真正可移动可构造
- 在编译时检查类型是否为 std::basic_string<T> C++
- 在C++中,转换为simd类型是否有未定义的行为
- POD类型是否完全等同于琐碎的标准布局类型
- 聚合类型是否意味着它也是标准布局
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 特征:从数组类型中获取标量类型是否记录?