gpt4 book ai didi

c++ - 在boost hana中过滤元组

转载 作者:太空狗 更新时间:2023-10-29 19:48:05 25 4
gpt4 key购买 nike

template<class... Ts, class T>
constexpr auto contains(T&&){
auto types = hana::to<hana::tuple_tag>(hana::tuple_t<Ts...>);
return hana::bool_c<hana::find(types, hana::type_c<T>) != hana::nothing>;
}

auto ht = hana::make_tuple(1,2,3,'c');

auto ht1 = hana::filter(ht, [](auto t){
return contains<int,float,double>(t);
});
//prints 0
std::cout << hana::size(ht1) << std::endl;

我不确定我是否正确使用了 boost hana,但 contains 似乎有效。

std::cout << contains<int,float,double>(5) << std::endl;   // 1
std::cout << contains<int,float,double>('c') << std::endl; // 0
std::cout << contains<int,float,double>(5.0f) << std::endl; // 1

为什么ht1的大小是0?

最佳答案

这里的问题其实和Hana无关,是和universal references的推导方式有关。只是为了清理东西,hana::type_c<T> == hana::type_c<U>恰好等于 std::is_same<T, U>{} .比较 hana::type 时没有引用或 cv-qualifier 删除秒。您可以查看有关这些规则的各种文章(例如 thisthis)。

现在,让我检查一下您的代码并修改一些内容,并附上注释。首先,

  auto types = hana::to<hana::tuple_tag>(hana::tuple_t<Ts...>);

是多余的,因为您已经在创建 hana::tuplehana::tuple_t .因此,hana::tuple_t<T...>仅此而已。其次,有这一行:

  return hana::bool_c<hana::find(types, hana::type_c<T>) != hana::nothing>;

而不是检查 hana::find(...) != hana::nothing , 我会改用 hana::contains ,它能更好地表达您的意图,也可能会得到更优化。一般来说,尤其是对于带有 Hana 的元编程库,不要试图推理什么会更快。尽可能清楚地说明你的意图,并希望我在实现方面做好我的工作:-)。因此,你最终会得到

return hana::bool_c<hana::contains(types, hana::type_c<T>)>;

现在,hana::bool_c<...>真的是多余的,因为hana::contains已经返回一个 bool 值 integral_constant .因此,上面的等价于更简单的

return hana::contains(types, hana::type_c<T>);

最后,把所有的部分放在一起并化简,你得到

template<class... Ts, class T>
constexpr auto contains(T&&){
return hana::contains(hana::tuple_t<Ts...>, hana::type_c<T>);
}

我个人不喜欢参加 T&&作为参数,当您真正想要的只是该对象的类型时。实际上,这会迫使您实际向 contains 提供一个对象函数,在某些情况下可能很笨拙(如果周围没有对象怎么办?)。此外,将值与类型进行比较可能会造成混淆:

contains<int, char, double>(3.5) // wtf, 3.5 is not in [int, char, double]!

相反,如果是我自己的代码,我会编写以下内容:

template<class... Ts, class T>
constexpr auto contains(T type){
return hana::contains(hana::tuple_t<Ts...>, type);
}

// and then use it like
contains<int, char, double>(hana::type_c<double>)

但那是你的函数接口(interface)的一部分,我想你比我更清楚你在接口(interface)方面的需求。

关于c++ - 在boost hana中过滤元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33926237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com