C++ 协程/Visual Studio:生成器如何调用代表它生成值的函数?
C++ coroutines / Visual Studio: How can a generator call a function that yields values on its behalf?
协程定义为 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf 并在 VS2015/Update 3 中实现,生成器如何调用代表它发出值的函数?
说明示例
我想写代码如下...
static void yield_for_me()
{
co_yield 27; // does not compile
// co_yield relies on hidden definitions
}
std::experimental::generator<int> testf()
{
yield_for_me();
co_yield 28;
}
...希望它会产生与以下代码完全相同的结果:
std::experimental::generator<int> testf()
{
co_yield 27;
co_yield 28;
}
不能。这是 P0057 提出的协程模型的一个众所周知的限制。
尽管在论文中,它还描述了一个 recursive_generator
(未包含在 MSVC 中),它允许您执行如下操作:
recursive_generator<int> yield_for_me()
{
co_yield 27;
}
recursive_generator<int> testf()
{
co_yield yield_for_me();
co_yield 28;
}
顺便说一句,在 CO2 中实现了这样的事情,这是对提议模型的仿真。
在函数中使用 co_yield
/co_await
/co_return
将其变成协程,因此它需要具有允许编译器发现库的签名 类向编译器解释协程的含义。
Visual Studio 中包含的生成器不支持将 co_yield
委托给另一个生成器。但是创建一个可以的 recursive_generator
并不难。
这是一个 recursive_generator 的示例,它允许生成一个值或不同生成器的执行结果。
https://gist.github.com/GorNishanov/29e813139175b1c5299ad01021d2556d
recursive_generator的promise_type定义了两个yield_value
函数:
yield_value(T const&); // This one yields individual values
yield_value(recursive_generator<T>&&); // delegates to another generator
使用上面的 recursive_generator,只需将 yield_from_me 函数的 return 类型从 void 更改为 recursive_generator 即可。
recursive_generator<int> yield_for_me()
{
co_yield 27;
}
recursive_generator<int> testf()
{
co_yield yield_for_me();
co_yield 28;
}
协程定义为 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf 并在 VS2015/Update 3 中实现,生成器如何调用代表它发出值的函数?
说明示例
我想写代码如下...
static void yield_for_me()
{
co_yield 27; // does not compile
// co_yield relies on hidden definitions
}
std::experimental::generator<int> testf()
{
yield_for_me();
co_yield 28;
}
...希望它会产生与以下代码完全相同的结果:
std::experimental::generator<int> testf()
{
co_yield 27;
co_yield 28;
}
不能。这是 P0057 提出的协程模型的一个众所周知的限制。
尽管在论文中,它还描述了一个 recursive_generator
(未包含在 MSVC 中),它允许您执行如下操作:
recursive_generator<int> yield_for_me()
{
co_yield 27;
}
recursive_generator<int> testf()
{
co_yield yield_for_me();
co_yield 28;
}
顺便说一句,在 CO2 中实现了这样的事情,这是对提议模型的仿真。
在函数中使用 co_yield
/co_await
/co_return
将其变成协程,因此它需要具有允许编译器发现库的签名 类向编译器解释协程的含义。
Visual Studio 中包含的生成器不支持将 co_yield
委托给另一个生成器。但是创建一个可以的 recursive_generator
并不难。
这是一个 recursive_generator 的示例,它允许生成一个值或不同生成器的执行结果。
https://gist.github.com/GorNishanov/29e813139175b1c5299ad01021d2556d
recursive_generator的promise_type定义了两个yield_value
函数:
yield_value(T const&); // This one yields individual values
yield_value(recursive_generator<T>&&); // delegates to another generator
使用上面的 recursive_generator,只需将 yield_from_me 函数的 return 类型从 void 更改为 recursive_generator 即可。
recursive_generator<int> yield_for_me()
{
co_yield 27;
}
recursive_generator<int> testf()
{
co_yield yield_for_me();
co_yield 28;
}