【发布时间】:2023-02-08 23:47:43
【问题描述】:
我写了很多基于 TCP/IP 的 C++ 软件,我使用现代 C++ 协程进行网络通信。现在假设我有一组 URL,我想找到哪个 URL 下载包含“Hello”字符串的文档:
vector<string> my_urls = { /* URLs list here */ };
auto hello_iterator = find_if(my_urls.begin(), my_urls.end(), [](const string &url)
{
string downloaded_data = download(url);
return downloaded_data.find("Hello") != string::npos;
});
这里我们使用同步download(const std::string& url)函数为每个URL下载数据。
对于协程,我想做类似的事情:
vector<string> my_urls = { /* URLs list here */ };
vector<string> downloaded_data;
auto hello_iterator = find_if(my_urls.begin(), my_urls.end(), [](const string &url) -> MyPromiseClass
{
string downloaded_data = co_await async_download(url);
return downloaded_data.find("Hello") != string::npos;
});
我有 MyPromiseClass async_download(const std::string& url),效果很好,我想用它来异步下载数据。
但是这样的代码无法编译。在 Visual C++ 中,我有以下错误:
错误 C2451:“MyPromiseClass”类型的条件表达式不是 有效的
原因是标准的
find_if算法“不知道”协程,只是试图将MyPromiseClass转换为bool。但是,我可以轻松实现
find_if和/或任何其他标准算法的协程版本,只需将其if语句更改为在调用谓词时使用co_await并返回 promise 而不是迭代器的语句即可,所以我希望C++标准也应该包含类似的算法?请告知 C++ 标准中是否有任何版本的
<algorithm>标头或boost支持协程,或者是否有任何方法可以轻松地将“旧”算法从<aglorithm>标头转换为支持协程而无需手动重写它们或丑陋的代码首先预先计算值(使用协程)然后在这些预先计算的值上使用算法而不是仅仅等待 lambda 表达式中的数据?
【问题讨论】:
标签: c++ algorithm c++-coroutine