我已经实现了两个使用Resumable
该类的协程:
#include <coroutine>
#include <future>
#include <iostream>
class Resumable
{
public:
class promise_type
{
public:
auto initial_suspend()
{
return std::suspend_always();
}
auto final_suspend() noexcept
{
return std::suspend_always();
}
auto yield_value(const int& value)
{
value_ = value;
return std::suspend_always();
}
auto return_value(const int& value)
{
value_ = value;
return std::suspend_always();
}
auto get_return_object()
{
return std::coroutine_handle<promise_type>::from_promise(*this);
}
void unhandled_exception()
{
}
public:
int value_;
};
public:
Resumable(std::coroutine_handle<promise_type> handle)
: handle_{ handle }
{
}
~Resumable()
{
handle_.destroy();
}
int get()
{
if (!handle_.done())
{
handle_.resume();
}
return handle_.promise().value_;
}
private:
std::coroutine_handle<promise_type> handle_;
};
Resumable generate(int a)
{
for (int i = 1; i < a; ++i)
{
co_yield i;
}
co_return 0;
}
Resumable n_generate(int a)
{
auto gen = generate(a);
for (auto value = gen.get(); value != 0; value = gen.get())
{
//std::cout << -value << std::endl; <-- uncommenting this fixes the problem
co_yield -value;
}
co_return 0;
}
int main(int argc, const char* argv[])
{
auto gen_10 = n_generate(10);
for (auto value = gen_10.get(); value != 0; value = gen_10.get())
{
std::cout << value << std::endl;
}
return 0;
}
此代码的输出为空。
如果我取消注释标记 line in 的行n_generate
,输出将是:
-1
-1
-2
-2
-3
-3
-4
-4
-5
-5
-6
-6
-7
-7
-8
-8
-9
-9
如何将负值传递给main
而不在函数中打印它们n_generate
?
我在 Ububtu 20.04 上使用 gcc-10。我的 makefile 中的其他标志:
LDLIBS := -lstdc++
CXXFLAGS := -g -std=c++2a -fcoroutines