Все становится немного интереснее, когда операция Async’ обратный вызов передает несколько интересных элементов данных. Одним из подходов было бы использование std::парик< для захвата обоих:
std::pair< AsyncAPI::errorcode, std::string > read_ec( AsyncAPI & api) {
typedef std::pair< AsyncAPI::errorcode, std::string > result_pair;
boost::fibers::promise< result_pair > promise;
boost::fibers::future< result_pair > future( promise.get_future() );
#if ! defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)
api.init_read([promise=std::move( promise)]( AsyncAPI::errorcode ec, std::string const& data) mutable {
promise.set_value( result_pair( ec, data) );
});
#else
api.init_read(
std::bind([]( boost::fibers::promise< result_pair > & promise,
AsyncAPI::errorcode ec, std::string const& data) mutable {
promise.set_value( result_pair( ec, data) );
},
std::move( promise),
std::placeholders::_1,
std::placeholders::_2) );
#endif
return future.get();
}
После объединения интересных данных в std::pair< код фактически идентичн write_ec(). Вы можете назвать это так:
std::tie( ec, data) = read_ec( api);