新的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::调整(xs,value,f)要求'xs‘成为一个函子”);
然而,这似乎与调整文档不一致,这些文档指出,xs需要是一个结构。
任何建议都值得赞赏,因为我认为我在我的理解中遗漏了一些基本的东西。
发布于 2016-07-26 10:50:14
问题在于Hana使用了函数式编程术语,其中函子的含义与C++中通常使用的含义不同(即函数对象)。
在adjust签名中
(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返回一个值),代码将编译(示例):
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 (示例):
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; });https://stackoverflow.com/questions/38587360
复制相似问题