gpt4 book ai didi

c++ - 在 C++ 中模拟延迟 IEnumerable 的 C# 概念的现有方法?

转载 作者:行者123 更新时间:2023-11-28 02:43:49 24 4
gpt4 key购买 nike

我希望在 C++ 中实现类似于延迟 IEnumerable 概念的东西,但没有模板实现。 (我的问题与 this other question 非常相似,除了破坏交易的模板。)

在我们的代码中,我们有许多函数接收要查询的规范并将结果存储在传递的 std::vector& 中。通常这些功能会调用较低级别的版本,这些版本会进行自己的过滤并与其他集合组合。有时他们会创建本地 vector (使用不同的临时分配器)来调用较低级别的函数,然后在过滤后 push_back 到调用者的 vector 。这些不是通用功能,无论是在文字上还是在精神上。

我希望消除拷贝和分配,甚至不需要结果容器。另外,在我这样做的同时,我想给它一个短路能力。

这里显然需要延迟操作。在 C# 中,这很容易。一切都产生一个 IEnumerable,并使用 Where() 等运算符,全部延迟。

我知道如何在 C++ 中执行此操作,传递回调而不是容器。我们只需要抽象的“push_back”,加上一个返回的 bool 值“在这里停止”。回调将与 IEnumerable 运算符非常相似地链接在一起,尽管在操作中它更像是推拉式,并且可能感觉有点像 IObservable。

最重要的是,我必须避免模板化这些函数实现。我不想重构很多代码,也不想在我们目前正在编译的 15 个左右的不同平台上遇到不受支持的编译器意外。所以没有 promise ,没有(我认为)。并且没有 C++11。

这似乎是一个已解决的问题,但我在 Google 上四处搜寻,可能还没有找到正确的提问方式。这个问题已经解决了吗?

最佳答案

我重新阅读了你的问题,我实际上认为这是可以服务的,但如果没有 C++11,它绝对不理想。

可以考虑boost::function<boost::optional<T>()> (yay Boost)作为一个范围。这个范围的语义非常简单——你调用它,当它完成时,它返回一个空的可选而不是一个值。

对于像push_back这样的输出操作,你可以考虑一个boost::function<void(T)>它将接受该值,然后用它做任何你需要的事情。然而,一般来说,这些并不是那么有用,因为大多数函数都可以编写为返回修改后的范围,然后调用者可以直接使用该范围而不需要获取输出范围。

这里没有 lambda 是一个彻头彻尾的婊子,但你可以看看例如Boost.Phoenix/Lambda 提供帮助。

关于c++ - 在 C++ 中模拟延迟 IEnumerable<T> 的 C# 概念的现有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com