...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Things get a bit more interesting when the async operation’s callback passes
multiple data items of interest. One approach would be to use std::pair<>
to capture both:
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() ); // We promise that both 'promise' and 'future' will survive until our // lambda has been called. #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 // defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES) 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 // BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES return future.get(); }
Once you bundle the interesting data in std::pair<>
, the code is effectively identical
to write_ec()
.
You can call it like this:
std::tie( ec, data) = read_ec( api);