首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost hana查找集类型

Boost hana查找集类型
EN

Stack Overflow用户
提问于 2016-07-26 10:28:41
回答 1查看 286关注 0票数 1

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

这是代码:

代码语言:javascript
复制
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::调整(xs,value,f)要求'xs‘成为一个函子”);

然而,这似乎与调整文档不一致,这些文档指出,xs需要是一个结构。

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

EN

回答 1

Stack Overflow用户

发布于 2016-07-26 10:50:14

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

adjust签名中

代码语言:javascript
复制
(auto&& xs, auto&& value, auto&& f)

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

然后xs是F (T ),是T上的函子f是(T→T),它是将T的值映射到TE 215的函数对象。

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

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

代码语言:javascript
复制
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 with hana::for_each (示例):

代码语言:javascript
复制
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; });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38587360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档