微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

容器和范围算法可以是 C++20 中函数组合运算符的两个操作数吗?

如何解决容器和范围算法可以是 C++20 中函数组合运算符的两个操作数吗?

正如我们所知,在 c++20 管道运算符 | 代表函数组合,但在下面的代码中,我们传递一个容器和一种算法,所以它是如何工作的以及我们如何能够传递不同的容器类型相同的功能

int main()
{
    std::vector<int> vnumbers = {1,2,3,4,5,6};
    std::list<int> lnumbers = {6,1};
    auto vresults = vnumbers | std::views::filter([](int n){ return n % 3 == 0; });
    auto lresults = lnumbers | std::views::filter([](int n){ return n % 3 == 0; });
    for (auto e:vresults)
    {
        std::cout<<"V:"<<e<<std::endl;
    }
    for (auto e:lresults)
    {
        std::cout<<"L:"<<e<<std::endl;
    }
}

解决方法

正如我们所知,在 c++20 管道运算符 | 代表函数组合,但在下面的代码中,我们传递了一个容器和一种算法,那么它是如何工作的

| 代表函数组合有点不准确,这正是您在问题中提到的原因:函数组合允许将 函数 组合在一起,符合 {{3 }}。

另一方面,当我们不想太迂腐时,我们可以接受组合函数意味着“使用它们的语法很好,允许管道单个流数据通过其中许多”。这正是 Range-v3 和 <ranges> 所允许的。写这个

auto out = in | filter(f) | tranform(g) | take(n) | drop(m);

意思与此相同(模我没有测试过,可能参数相反,我不记得了,因为我总是使用 | 语法)

auto out = drop(take(transform(filter(in,f),g),n),m);

这意味着您正在申请 in 4 个函数的组合。 但是这 4 个函数不是 filtertransformtake 和 {{1} },而是将第二个参数分别绑定到 dropfgn 的那 4 个函数。

Boost.Hana 确实提供了一个名为 mathematical definition 的函数组合函数。

请注意,绑定第二个参数的函数指的是所谓的“部分函数应用程序”,Boost.Hana 也通过{{ 3}} 和 boost::hana::compose

我们如何能够将不同的容器类型传递给同一个函数?

好吧,我们使用 C++ 并且我们有模板,因此将不同类型的对象传递给同一个“函数”(好吧,函数模板)不应该吓到我们。在范围上下文中,所有这些函数/函数对象 mfilter 等都期望 boost::hana::partial,即 transform 和 {{1} } 可以被调用,所以 beginend 都符合要求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。