1

新手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::adjust(xs, value, f) 要求 'xs' 是一个 Functor");

然而,这似乎与调整xs需要成为结构的状态的文档不一致。

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

4

1 回答 1

2

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

在签名中adjust

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

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

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

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

Set不是Functor,因为它的不变性是值最多出现一次。如果您替换make_setmake_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::filterhana::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; });
于 2016-07-26T10:50:14.800 回答