Я играл с сопрограммами C ++ 20 и пытался переместить часть моей кодовой базы, чтобы использовать их. Однако я столкнулся с проблемой, поскольку не похоже, что новые сопрограммы можно скопировать. Объекты generator
удалили конструкторы копирования и операторы присваивания копий, и ничто из того, что я изучал, похоже, не нашло выхода.
Можно ли это сделать?
Для справки, я написал небольшую тестовую программу с неудачной попыткой копирования сопрограмм C ++ 20, а также успешной попыткой сделать то же самое с boost::asio::coroutine
. Используется Visual Studio 2019 версии 16.3.7.
#include <sdkddkver.h>
#include <string>
#include <algorithm>
#include <iterator>
#include <experimental\resumable>
#include <experimental\generator>
#include <cassert>
#include <boost\asio\yield.hpp>
namespace std_coroutines {
auto letters() {
for (auto c = 'a'; ; ++c)
co_yield c;
}
void run() {
auto gen = letters();
std::string s1, s2;
std::copy_n(gen.begin(), 3, std::back_inserter(s1)); // append "abc" to s1
//auto gen_copy = gen; // doesn't compile
std::copy_n(gen.begin(), 3, std::back_inserter(s1)); // append "def" to s1
//std::copy_n(gen_copy.begin(), 3, std::back_inserter(s2)); // append "def" to s2
assert(s1 == "abcdef");
assert(s2 == "def"); // fails
}
};// namespace std_coroutines
namespace boost_asio_coroutines {
struct letters : boost::asio::coroutine {
char c = 'a';
char operator()() {
reenter(this) for (;; ++c)
{
yield return c;
}
}
};
void run() {
auto gen = letters();
std::string s1, s2;
std::generate_n(std::back_inserter(s1), 3, std::ref(gen)); // append "abc" to s1
auto gen_copy = gen;
std::generate_n(std::back_inserter(s1), 3, std::ref(gen)); // append "def" to s1
std::generate_n(std::back_inserter(s2), 3, std::ref(gen_copy)); // append "def" to s2
assert(s1 == "abcdef");
assert(s2 == "def");
}
} // namespace boost_asio_coroutines
int main() {
boost_asio_coroutines::run();
std_coroutines::run();
}
std::generator
становится владельцем базовой сопрограммы; поэтому его можно только перемещать (поскольку базовая сопрограмма не может быть скопирована). - person Meowmere   schedule 31.10.2019#include
путях. Прямая косая черта отлично работает везде, поэтому просто используйте их по умолчанию. - person rubenvb   schedule 31.10.2019