Но более естественный API для функции, которая получает данные, — это возвращать только данные об успехе, бросая исключение на ошибку.
Как и в случае<write()>выше, можно кодировать<read()>обертку с точки зрения<read_ec()>. Но поскольку данное приложение вряд ли будет нуждаться в обоих, пусть и #8217;<read()>с нуля, используя<promise::set_exception()>:
std::string read( AsyncAPI & api) {
boost::fibers::promise< std::string > promise;
boost::fibers::future< std::string > future( promise.get_future() );
#if ! defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)
api.init_read([&promise]( AsyncAPI::errorcode ec, std::string const& data) mutable {
if ( ! ec) {
promise.set_value( data);
} else {
promise.set_exception(
std::make_exception_ptr(
make_exception("read", ec) ) );
}
});
#else
api.init_read(
std::bind([]( boost::fibers::promise< std::string > & promise,
AsyncAPI::errorcode ec, std::string const& data) mutable {
if ( ! ec) {
promise.set_value( data);
} else {
promise.set_exception(
std::make_exception_ptr(
make_exception("read", ec) ) );
}
},
std::move( promise),
std::placeholders::_1,
std::placeholders::_2) );
#endif
return future.get();
}
<future::get()>будет поступать правильно, либо возвращая<std::string>, либо выбрасывая исключение.