C++11 C++;11 Lambda发生器-如何发出最后一个元件或结束信号?
我正在和查看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++]; };
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 ); }