void apply(Source&& src, Destination& dest, boost::mpl::false_) const { try { dest.set_value(src.get()); } catch (...) { dest.set_exception(boost::current_exception()); } }
void apply(Source && src, Destination& dest, std::false_type) const { try { dest.set_value(src.get()); } catch (...) { dest.set_exception(std::current_exception()); } }
void apply(Source && src, Destination& dest, std::true_type) const { try { src.get(); dest.set_value(util::unused); } catch (...) { dest.set_exception(std::current_exception()); } }
void apply(Source&& src, Destination& dest, boost::mpl::true_) const { try { src.get(); dest.set_result(util::unused); } catch (...) { dest.set_exception(boost::current_exception()); } }