c++ - 使用 boost::hana 过滤具有类型的列表

标签 c++ c++14 boost-hana

我正在尝试过滤掉带有类型的列表,但这似乎不起作用。我确信我在这里做错了什么,这是我为重现它而创建的测试:

#include <iostream>

#include <boost/hana.hpp>
#include <boost/hana/ext/std/tuple.hpp>

struct X {
};
struct Y {
};
struct Z {
};

int main(int argc, char **argv) {

    namespace hana = boost::hana;

    constexpr std::tuple<X, Y, Z> list;
    constexpr std::tuple<X> filterlist;

    auto t = hana::filter(list, [&](auto t) {
            return hana::not_(hana::contains(filterlist, hana::decltype_(t)));
        });

    std::cout << "filtered list contains " << hana::size(t) << " items, expected 2 items" << std::endl;

    return 0;
}

基本上我想要的是: 我有一个类型列表,我想返回一个包含不在过滤器列表中的项目的列表。所以在这种情况下,它应该是 std::tuple<Y, Z> .

这个程序的当前输出是: 筛选后的列表包含 3 个项目,应为 2 个项目

问候,马蒂斯

最佳答案

问题是您正在检查类型 ( decltype_(X{}) == type<X>{}) 是否在过滤器列表中,该列表包含实际对象,而不是类型。换句话说,这有点像您要比较 std::type_info。表示某种类型的对象 T使用实际类型的对象 T ;这在语义上没有意义。相反,您想要的是以下内容:

#include <iostream>
#include <boost/hana.hpp>
#include <boost/hana/ext/std/tuple.hpp>
namespace hana = boost::hana;

struct X { };
struct Y { };
struct Z { };

int main(int argc, char **argv) {
  constexpr std::tuple<X, Y, Z> list;
  constexpr std::tuple<hana::type<X>> filterlist;
  auto t = hana::remove_if(list, [&](auto t) {
    return hana::contains(filterlist, hana::decltype_(t));
  });

  std::cout << "filtered list contains " << hana::size(t) << " items, expected 2 items" << std::endl;
}

话虽这么说,如果你已经有了 filterlist无论如何用于其他目的的元组,您仍然可以使用它来过滤:

#include <iostream>
#include <boost/hana.hpp>
#include <boost/hana/ext/std/tuple.hpp>
namespace hana = boost::hana;

struct X { };
struct Y { };
struct Z { };

int main(int argc, char **argv) {
  constexpr std::tuple<X, Y, Z> list;
  constexpr std::tuple<X> filterlist;
  auto t = hana::remove_if(list, [&](auto t) {
    return hana::any_of(filterlist, [&](auto u) {
        return hana::decltype_(u) == hana::decltype_(t);
    });
  });

  std::cout << "filtered list contains " << hana::size(t) << " items, expected 2 items" << std::endl;
}

最后要注意的是,要警惕这些结构,因为它们是 O(n^2) 编译时间。如果您需要高效查找,请考虑使用 hana::set (现在的实现很糟糕,但当我有更多时间时它会变得更好)。

关于c++ - 使用 boost::hana 过滤具有类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39447133/

相关文章:

c++ - 是否可以对使用 Boost Hana 的方法进行内省(introspection)?

c++ - QtCreator qmake 无法运行编译器 'cl'

c++ - std::string_view 是否可以简单复制?

C++ 隐式数字类型降级

c++ - 使用 constexpr 进行全局初始化顺序

C++14 函数式 logical_not 函数

c++ - 了解使用 hana::compose 和 shared_ptr 时的内存管理问题

c++ - 如何为模板类型创建别名?

从另一个成员访问成员的 C++ 间接

c++ - 增量增长元组