Но более естественный 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
>, либо выбрасывая исключение.