通过模板方法的迭代器返回集合

时间:2018-11-08 15:24:07

标签: c++ templates iterator

让我们说(为简单起见),我想将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)); } 或其他一些特定的收藏夹。我想要一种可以处理任何类型集合的通用方法。

3 个答案:

答案 0 :(得分:1)

一般的C ++方法是接受 output 迭代器。让调用者决定输出应该去哪里。

答案 1 :(得分:1)

ranges库使用范围的概念-一对开始和结束迭代器。如果您打算大量编写类似LINQ的代码,则可能应该研究一下,并根据其概念编写代码:

https://github.com/ericniebler/range-v3

答案 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);
    });
}