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
需要是一个结构。
任何建议都值得赞赏,因为我认为我在理解中遗漏了一些基本内容。
答案 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::filter
与hana::for_each
(Example):
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; });