使用boost::hana过滤类型列表
Filtering a list with types using 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项
问候,Matthijs
问题是您正在检查类型(decltype_(X{}) == type<X>{}
)是否在过滤器列表中,该列表包含实际对象,而不是类型。换句话说,这有点像你试图将代表某种类型T
的std::type_info
对象与实际类型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
(现在的实现很糟糕,但当我有更多的时间时,它会变得更好)。
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 测试两个类型列表中的所有组合
- 谷歌测试:模板模板的笛卡尔乘积的类型列表与模板
- 在迭代模板类型列表时无法停止递归
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- 阅读从 istream 到矢量的不同类型列表
- 如何在C++中创建类型列表的 n 路笛卡尔积?
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- 将变量模板限制为类型列表
- 我可以使用特征指定变体的类型列表吗?
- 如何对要用于模板参数的类型列表进行编码
- 创建类型列表并访问每种类型的静态成员?
- 为什么BOOST :: HANA :: EXAREMIS ::键入实验功能?类型列表的棘手是什么
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- std::仅移动类型列表:不能在 VC++ 中放入 std::vector
- C++类型列表创建子列表
- 调用STD ::功能,并带有变体类型列表
- 在没有宏的情况下在 C++98 中创建类型列表时遇到问题
- 如何从类型列表重建参数包