C++ 以函数方式组合谓词

C++ 以函数方式组合谓词,c++,functional-programming,functor,boost-hana,lifting,C++,Functional Programming,Functor,Boost Hana,Lifting,Boost Hana是否提供了一种将谓词与逻辑运算符相结合的方法 我指的大概是这样的东西 constexpr auto-both=[](自动和f、自动和g){ return[&f,&g](自动和&x){return f(x)和&g(x);}; }; 可以这样使用: intmain(){ 向量v{1,2,3,4,5,6,7,8,9,10}; 自动小于等于7=hana::反向部分(std::小于等于{},7); 自动大于等于hana::反向部分(std::大于等于{},3); auto r=ran

Boost Hana是否提供了一种将谓词与逻辑运算符相结合的方法

我指的大概是这样的东西

constexpr auto-both=[](自动和f、自动和g){
return[&f,&g](自动和&x){return f(x)和&g(x);};
};
可以这样使用:

intmain(){
向量v{1,2,3,4,5,6,7,8,9,10};
自动小于等于7=hana::反向部分(std::小于等于{},7);
自动大于等于hana::反向部分(std::大于等于{},3);
auto r=ranges::views::remove_if(v,两者(小于_7,大于_3));
}
其中,从Hana中,我还希望能以中缀方式使用它,类似于
两者(小于7,大于3)==小于7^all^大于3
(尽管
会更好,但我刚刚发现它是
&
的同义词)

或者它是否提供了一种方法来提升标准操作符
&&
来操作函数functor?

您可以使用如下方法:

auto-both=hana::demux(std::logical_和{});
//或者对于任意数量的谓词
auto all=hana::demux([](auto const&…x)noexcept((static_cast(x),…)){return(true&&…&&static_cast(x));});
范围::视图::如果(v,两者(小于等于7,大于等于3)),则删除;

哦,太好了!名称
all
有点误导人,因为它告诉我它将
/
&&
合并为零个或多个谓词的结果,而不是两个谓词的结果。我将保留该名称给
hana::demux([](auto const&…x){return(…&&x);})
。如果你同意,我可以自己编辑你的答案,如果不同意,我可以为读者添加另一个答案(你的答案可以接受)。@Enrico出于某种原因,我认为
logical\u和
是可变的。现在修好了哦,那是什么?你能解释一下为什么
noexcept(bla)
(我想这与函数的功能无关)和
true&&&&
,我怀疑这与使用零参数调用函数
all
有关,这似乎无论如何都不起作用。@Enrico
noexcept(…)
只会生成lambda noexcept,如果所有参数都可以
noexcept
-转换为bool(允许进行一些优化)<代码>true&&&&
是多余的,但我发现它更清楚(对于空包,
…&&&
有一个边缘案例,使它成为
真的
)。和
all()(x)=true
(因为“所有0个约束都已满足”)
auto both = hana::demux(std::logical_and<bool>{});
// Or for any number of predicates
auto all = hana::demux([](auto const&... x) noexcept(noexcept((static_cast<bool>(x), ...))) { return (true && ... && static_cast<bool>(x)); });
ranges::views::remove_if(v, both(less_than_7, more_than_3));