我在许多Python程序中都使用了yield,在很多情况下它确实清除了代码.我在博客上写了这篇文章,这是我网站的热门网页之一.
C#还提供了收益 - 它通过调用者端的状态保持来实现,通过自动生成的类来完成,该类保持状态,函数的局部变量等.
我目前正在阅读有关C++ 0x及其添加的内容; 在阅读有关C++ 0x中lambda的实现时,我发现它也是通过自动生成的类完成的,配备了存储lambda代码的operator().我心中形成了一个自然的问题:他们是为lambdas做过的,他们为什么不考虑支持"收益"呢?
当然,他们可以看到合作例程的价值......所以我只能猜测他们认为基于宏的实现(例如Simon Tatham的)是一个充分的替代品.然而,它们不是出于多种原因:被调用者保持状态,非重入状态,基于宏观(仅此一点是足够的理由)等.
编辑: yield
不依赖于垃圾收集,线程或光纤.您可以阅读Simon的文章,看看我在谈论编译器进行简单的转换,例如:
int fibonacci() {
int a = 0, b = 1;
while (true) {
yield a;
int c = a + b;
a = b;
b = c;
}
}
Run Code Online (Sandbox Code Playgroud)
成:
struct GeneratedFibonacci {
int state;
int a, b;
GeneratedFibonacci() : state (0), a (0), b (1) {}
int operator()() {
switch (state) {
case 0:
state = 1;
while (true) { …
Run Code Online (Sandbox Code Playgroud) public void Consumer()
{
foreach(int i in Integers())
{
Console.WriteLine(i.ToString());
}
}
public IEnumerable<int> Integers()
{
yield return 1;
yield return 2;
yield return 4;
yield return 8;
yield return 16;
yield return 16777216;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用模板技巧(或其他)在c ++中获得相同的语法?
这段代码并不是JS开发人员所不知道的
function get_counter()
{
return (
function() {
var c = 0;
return function() { return ++c; };
})();
}
Run Code Online (Sandbox Code Playgroud)
它基本上创建了一个创建不同的枚举器.所以我想知道在使用新的lambda语义的C++ 11中是否可以做同样的事情?我最终写了这篇C++,遗憾的是它不能编译!
int main()
{
int c;
auto a = [](){
int c = 0;
return [&](){
cout << c++;
};
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有一个解决方法来编译它,如果有编译器如何使这个代码正确运行?我的意思是它必须创建单独的枚举器,但它也应该收集垃圾(未使用的c变量).
顺便说一句,我正在使用VS2012编译器,它会生成此错误:
Error 2 error C2440: 'return' : cannot convert from 'main::<lambda_10d109c73135f5c106ecbfa8ff6f4b6b>::()::<lambda_019decbc8d6cd29488ffec96883efe2a>' to 'void (__cdecl *)(void)' c:\users\ali\documents\visual studio 2012\projects\test\test\main.cpp 25 1 Test
Run Code Online (Sandbox Code Playgroud) Guido Van Rossum在本文中演示了Python的简单性,并利用此函数对未知长度的文件进行缓冲读取:
def intsfromfile(f):
while True:
a = array.array('i')
a.fromstring(f.read(4000))
if not a:
break
for x in a:
yield x
Run Code Online (Sandbox Code Playgroud)
出于速度原因,我需要在C++中做同样的事情!我有很多文件包含我需要合并的无符号64位整数的排序列表.我找到了用于合并向量的这段代码.
我坚持如何为一个未知长度的文件创建一个ifstream作为一个向量,可以愉快地迭代,直到到达文件的末尾.有什么建议?我用istreambuf_iterator吠叫正确的树吗?