提升hana找到类型集

时间:2016-07-26 10:28:42

标签: c++ boost-hana

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; });

错误是:

  

&#34; hana :: adjust(xs,value,f)需要&#39; xs&#39;成为一个Functor&#34;);

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

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

1 个答案:

答案 0 :(得分:2)

问题在于Hana使用函数式编程术语,其中 Functor 意味着与C ++中通常用来表示的内容不同(即函数对象)。

adjust的签名中:

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

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

然后xs是F(T), Functor 超过 T ; f是(T→T),一个将 T 的值映射到 T 的函数对象。

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

设置不是 Functor ,因为它的值不变,最多只出现一次。如果您将make_set替换为make_tuple(并确保f返回值),您的代码将编译(Example):

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_eachExample):

一起使用
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; });