gpt4 book ai didi

c++ - boost::asio::yield_context 可以设置 std::error_code 而不是 boost::system::error_code 吗?

转载 作者:行者123 更新时间:2023-11-28 00:20:03 25 4
gpt4 key购买 nike

我正在编写一个在底层使用 Boost.Asio 的 C++11 网络库。我想公开一个允许用户使用堆栈协程的 API。

boost::asio::yield_context 重载 [] 运算符,以便异步操作可以设置错误代码而不是抛出异常。例如:

std::size_t n = my_socket.async_read_some(buffer, yield[ec]);
if (ec)
{
// An error occurred.
}

我的库使用 std::error_codestd::system_error 来报告错误。我的问题是如何让 boost::asio::yield_context 设置一个 std::error_code 而不是 boost::system::error_code ?我希望我的图书馆的用户能够这样做:

std::error_code ec;
auto result = remoteProdedureCall(args, yield[ec]);
if (ec)
handleError();

remoteProcedureCall 看起来像这样:

Result remoteProcedureCall(Args args, boost::asio::yield_context yield)
{
//...
boost::asio::async_write(socket_, argsBuffer, yield);
boost::asio::async_read(socket_, resultBuffer, yield);
if (invalidResult())
// Return a std::error_code via the yield object somehow???
// (My error codes belong to a custom error_category)
// ...
return result;
}

P.S. 我应该指出我的库使用属于自定义 error_category 的错误代码。

最佳答案

我最终做了一些比强制 yield_context 设置 std::error_code 简单得多的事情:

// This overload sets a std::error_code if there's an error.
Result remoteProcedureCall(Args args, boost::asio::yield_context yield,
std::error_code& userErrorCode)
{
//...
boost::system::error_code ec;
boost::async_write(socket_, buffer, yield[ec];
if (ec)
{
userErrorCode = toStdErrorCode(ec);
return Result();
}
// ...
if (someNonBoostError)
{
userErrorCode = make_error_code(myCustomErrorCode);
return Result();
}
// ...
return result;
}

// This overload throws an exception if there's an error
Result remoteProcedureCall(Args args, boost::asio::yield_context yield)
{
std::error_code ec;
auto result = remoteProcedureCall(args, yield, ec);
if (ec)
throw std::system_error(ec);
return result;
}

根据 Sam 的 answer,其中 toStdErrorCodeboost::system::error_code 转换为 std::error_code (另请参阅相关的 question )。


更简单的方法是让 remoteProcedureCall 接受一个指向 error_code 的可选指针。这避免了重复函数:一个设置错误代码,另一个抛出异常。

关于c++ - boost::asio::yield_context 可以设置 std::error_code 而不是 boost::system::error_code 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com