C++11 C++;11 Lambda发生器-如何发出最后一个元件或结束信号?

C++11 C++;11 Lambda发生器-如何发出最后一个元件或结束信号?,c++11,lambda,C++11,Lambda,我正在和查看lambda发电机。 我想将这些调整为模板版本,我想知道我应该返回什么来表示生成器已经结束 考虑 template<typename T> std::function<T()> my_template_vector_generator(std::vector<T> &v) { int idx = 0; return [=,&v]() mutable { return v[idx++]; };

我正在和查看lambda发电机。 我想将这些调整为模板版本,我想知道我应该返回什么来表示生成器已经结束

考虑

template<typename T>
std::function<T()> my_template_vector_generator(std::vector<T> &v) {
    int idx = 0;
    return [=,&v]() mutable {
        return v[idx++];
    };
}
向量版本显然需要调用站点的
v.size()
知识。我想在没有这个的情况下返回一些指示发电机是空的东西

通过头脑风暴,我可以想到以下几点:

  • 返回
    pair
    并在没有更多值时指示
    false

  • 将迭代器返回到容器值并迭代(auto it=gen();it!=gen.end();it=gen()){cout只要看起来像是学习示例,我就可以建议将异常添加为集合结束。但不要在实际代码中使用它。

    只要看起来像是学习示例,我就可以建议将异常添加为集合结束。但不要在实际代码中使用它。

    使用boost::optional。这看起来确实不错,但取决于boost iit’对于这个小项目来说,这不是一个选项。如果编译器支持的话,你可以尝试std::experimental::optional。这看起来很有趣。我调查了一下,这似乎只适用于g++.Hmm下的std=c++14。在c++11中当场构思这样一个包装器有多困难?nullptr和unique_ptr一起可能会重新设计生成这样的东西,不是吗?使用boost::optional。这看起来确实不错,但对于这个小项目来说,boost不是一个选项。如果编译器支持,你可以尝试使用std::experimental::optional。这看起来很有趣。我调查了一点,似乎这只适用于g++.Hmm下的std=c++14。如何d在C++11中当场构思这样一个包装器会是什么样子?nullptr和unique_ptr一起可能会复制类似的东西,不是吗?
    std::vector<double> v({1.0, 2.0, 3.0});
    auto vec_gen = my_template_vector_generator(v);
    REQUIRE( vec_gen() == 1 );
    REQUIRE( vec_gen() == 2 );
    v[2] = 5.0;
    REQUIRE( vec_gen() == 5.0 );
    
    template<typename T>
    std::function<std::unique_ptr<T>()> my_pointer_template_vector_generator(std::vector<T> &v) {
        int idx = 0;
        return [=,&v]() mutable {
            if (idx < v.size()) {
                return std::unique_ptr<T>(new T(v[idx++]));
            } else {
                return std::unique_ptr<T>();
            }
        };
    }
    
    TEST_CASE("Pointer generator terminates as expected") {
        std::vector<double> v({1.0, 2.0, 3.0});
    
        int k = 0;
        auto gen = my_pointer_template_vector_generator(v);
    
        while(auto val = gen()) {
            REQUIRE( *val == v[k++] );
        }
    
        REQUIRE( v.size() == k );
    }