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());
     }
 }