Boost hana find set in set

问题描述:

boost::hana的新功能,尝试一个简单的实验来找到一组类型中的一个类型,然后打印它的typeid.name。不过我正在static_assert错误(注:Xcode中7.2.1)Boost hana find set in set

这是代码:

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

的错误是:

“花::调整(XS,价值, f)要求'xs'是一个Functor“);

但是,这似乎与调整的文档不一致,其中指出xs需要是一个结构。

任何意见赞赏,因为我认为我失去了一些基本的理解。

问题是,Hana使用函数式编程术语,其中函数表示与C++中通常用来表示的内容不同的东西(即函数对象)。

在签名adjust

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

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

然后xs是F(T ),Functor over T; f是(T→T),函数对象将T的值映射到T

这里的另一个问题是,小写字母和大写字母F表示签名内的不同对象。

不是函子,其不变的,因为这至多出现一次值。如果您要更换make_setmake_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; }); 
+0

非常感谢;在这个层面上,我肯定有很多东西要学习功能和元编程。 另一方面,哈哈提供了一种方式来获取类型集合并根据其中一个匹配执行函数,而无需线性搜索列表。即执行查找表如呼叫? – AKB

+0

@AKB你可能想要'hana :: contains'(它返回'hana :: true_'或'hana :: false_')或'hana :: find'(它返回'hana ::只是<...>'或'hana :: nothing')。这两种方法都可以在'hana :: set'上高效地工作。 – ecatmur