在集合中提升hana查找类型

Boost hana find type in set

本文关键字:hana 查找 类型 集合      更新时间:2023-10-16

boost::hana新手,尝试一个简单的实验,在一组类型中找到一个类型,然后只打印它的typeid.name。然而,我得到了static_assert错误(注意:Xcode 7.2.1)

这是代码:

auto set = hana::make_set(hana::type_c<int>, hana::type_c<float>);
auto s = hana::adjust( set, hana::type_c<int>, [](auto x){ std::cout << typeid(x).name() << std::endl; });

错误为:

"hana::adjust(xs,value,f)要求'xs'为Functor");

然而,这似乎与adjust的文档不一致,后者指出xs需要是一个结构。

任何建议都值得赞赏,因为我认为我在理解中遗漏了一些基本的东西。

问题是Hana使用函数式编程术语,其中Functor的含义与C++中通常使用的含义不同(即函数对象)。

adjust的签名中:

(auto&& xs, auto&& value, auto&& f)

调整:F(T)×U×(T→T)→F(T)

xs是F(T),是T上的Functorf是(T→T) ,一个函数对象,它将T的值映射到T

这里的另一个问题是小写和大写的F指代签名中的不同对象。

Set不是Functor,因为它的不变量是值最多出现一次。如果用make_tuple替换make_set(并确保f返回值),则代码将编译(示例):

auto t = hana::make_tuple(hana::type_c<int>, hana::type_c<float>);
hana::adjust(t, hana::type_c<int>, [](auto x){ std::cout << typeid(x).name() << std::endl; return x; });

但是,您可能不应该在这里使用hana::adjust,因为您不关心返回值;相反,使用hana::filterhana::for_each(示例):

auto s = hana::make_set(hana::type_c<int>, hana::type_c<float>);
hana::for_each(hana::filter(hana::to_tuple(s), hana::equal.to(hana::type_c<int>)),
               [](auto x){ std::cout << typeid(x).name() << std::endl; });