我想知道如何在C++中实现像Python这样的生成器?Python可以使用关键字"yield"来执行此操作.但是如何在C++中实现呢?
xto*_*ofl 11
在C++中我们有'迭代器'.一个明确要求一个interator,明确地递增它并解除引用它.
如果您希望它们与标准库函数一起使用,它们应该主要来自std::forward_iterator并实现其中的许多函数.
模仿集合上的生成器的另一种方法是允许函数作为成员函数的参数,该函数将所有值的值(生成)提供给该函数:
struct MyCollection {
int values[30];
template< typename F >
void generate( F& yield_function ) const {
int* end = values+30; // make this better in your own code :)
for( auto i: values ) yield_function( *i );
}
};
// usage:
c.generate([](int i){ std::cout << i << std::endl; });
// or pre-C++11:
struct MyFunction {
void operator() (int i)const { printf( "%d\n", i); }
};
MyCollection c;
c.generate( MyFunction() );
Run Code Online (Sandbox Code Playgroud)
这......绅士......是纯粹的黑魔法:
http://www.codeproject.com/Articles/29524/Generators-in-C
我已经尝试过,它甚至可以递归地运行.从那以后我一直在经常使用它.生成器,几乎是C++中的一等公民.甚至没有任何性能开销.
我对作者表示最深切的敬意
详细说明迭代器实现:这是一个例子.它可以用作循环变量,也可以用作std算法.
#include <iterator>
template< typename T, typename TDiff = T >
struct TGenerator : public std::iterator<std::forward_iterator_tag,T,TDiff> {
T from,to;
T value;
TDiff step;
bool issentinel;
TGenerator( T from, T to, TDiff step, bool sentinel = false )
: from(from),to(to),step(step),issentinel(sentinel), value(from)
{}
void operator++(){ value += step; }
const T& operator*()const { return value; }
bool operator!=( const TGenerator& other ) const {
return value<to;
}
TGenerator sentinel()const { return TGenerator(0,0,0,true); }
};
#include <algorithm>
#include <iostream>
int main()
{
TGenerator<int> i(0,10,3);
std::copy( i, i.sentinel(), std::ostream_iterator<int>( std::cout, " " ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)