以功能方式组合谓词
Combining predicates in a functional way
Boost Hana 是否提供了一种将谓词与逻辑运算符结合起来的方法?
我指的大致是这样的
constexpr auto both = [](auto&& f, auto&& g){
return [&f,&g](auto&& x){ return f(x) && g(x); };
};
可以这样使用:
int main() {
std::vector<int> v{1,2,3,4,5,6,7,8,9,10};
auto less_than_7 = hana::reverse_partial(std::less_equal<int>{}, 7);
auto more_than_3 = hana::reverse_partial(std::greater_equal<int>{}, 3);
auto r = ranges::views::remove_if(v, both(less_than_7, more_than_3));
}
其中,从 Hana 那里,我还希望有一种类似于 hana::on
的中缀方式来使用它,如 both(less_than_7, more_than_3) === less_than_7 ^both^ more_than_3
(尽管 and
会更好, 但我刚刚发现它是 &&
).
的同义词
或者它是否提供了一种提升标准运算符 &&
以对函数仿函数进行运算的方法?
您可以像这样使用 demux
:
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));
Boost Hana 是否提供了一种将谓词与逻辑运算符结合起来的方法?
我指的大致是这样的
constexpr auto both = [](auto&& f, auto&& g){
return [&f,&g](auto&& x){ return f(x) && g(x); };
};
可以这样使用:
int main() {
std::vector<int> v{1,2,3,4,5,6,7,8,9,10};
auto less_than_7 = hana::reverse_partial(std::less_equal<int>{}, 7);
auto more_than_3 = hana::reverse_partial(std::greater_equal<int>{}, 3);
auto r = ranges::views::remove_if(v, both(less_than_7, more_than_3));
}
其中,从 Hana 那里,我还希望有一种类似于 hana::on
的中缀方式来使用它,如 both(less_than_7, more_than_3) === less_than_7 ^both^ more_than_3
(尽管 and
会更好, 但我刚刚发现它是 &&
).
或者它是否提供了一种提升标准运算符 &&
以对函数仿函数进行运算的方法?
您可以像这样使用 demux
:
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));