让我们说(为简单起见),我想将collection传递给方法,该方法将对集合的每个元素应用一些final file = File(path);
并返回此collection。例如。在C#中看起来像这样
Image.file(file);
我的目标是用C ++编写等效的函数。根据{{3}},我应该将两个迭代器传递给函数,它们将代表输入集合的边界。这样解决了传递集合的问题。但是如何退还托收呢?
我当时想我应该应用相同的逻辑,并从表示返回集合的函数返回一对迭代器。
这是我尝试编写等效功能的方法:
func
显然这不好,因为一旦我退出函数,迭代器就指向无内容,输出集合就会被丢弃。因此,如何解决此问题,应该是用C ++编写此代码的最佳方法。
注意:我不想传递并返回IEnumerable<Tout> Transform<Tin, Tout>(IEnumerable<Tin> collection,
Func<Tin, Tout> func)
{
return collection.Select(x => func(x));
}
或其他一些特定的收藏夹。我想要一种可以处理任何类型集合的通用方法。
答案 0 :(得分:1)
一般的C ++方法是接受 output 迭代器。让调用者决定输出应该去哪里。
答案 1 :(得分:1)
ranges
库使用范围的概念-一对开始和结束迭代器。如果您打算大量编写类似LINQ的代码,则可能应该研究一下,并根据其概念编写代码:
答案 2 :(得分:0)
(当前标准库)的C ++方法是接受输出迭代器,请参见std::transform
。
(未来)C ++方法是返回一个Range
值,请参见ranges
::transform
请注意,您可以将输出迭代器算法包装在asymmetric coroutine中 以获得类似范围的值。
template<typename InputIterator, typename Func>
auto transform(InputIterator begin, InputIterator end, Func func)
{
using coro_t = boost::coroutines2::coroutine<decltype(func(*begin))>;
return coro_t::pull_type([=](coro_t::push_type& yield)
{
std::transform(begin, end, yield, func);
});
}